我正在研究一个复杂的WPF应用程序,该应用程序几天就会挂起.除了GUI线程填充数据之外,还有一个线程可以将模型绑定到网格并触发INotifyPropertyChanged.PropertyChanged
事件.我编写了一个脚本来将MDbg附加到挂起进程并转储线程的当前堆栈跟踪.在找到死锁原因时它会有很大帮助,但这次没有用.
正在更新模型的线程在获取时停止ReadLock
:
Thread [#:8] *0. WindowsBase.dll#0!MS.Internal.ReaderWriterLockWrapper.get_ReadLock() (source line information unavailable) 1. WindowsBase.dll#0!System.ComponentModel.PropertyChangedEventManager.OnPropertyChanged(sender=<...>, args=System.ComponentModel.PropertyChangedEventArgs) (source line information unavailable) 2. ( ... firing PropertyChanged event ... )
GUI线程也发生了同样的事情:
Thread [#:0] *0. WindowsBase.dll#0!MS.Internal.ReaderWriterLockWrapper.get_ReadLock() (source line information unavailable) 1. WindowsBase.dll#0!System.ComponentModel.PropertyChangedEventManager.OnPropertyChanged(sender=MyCompany.Windows.ViewModel.Window.WindowViewModel, args=System.ComponentModel.PropertyChangedEventArgs) (source line information unavailable) 2. MyCompany.Windows.Contracts.dll#0!MyCompany.Windows.ViewModel.Model.ViewModelItemBase.NotifyPropertyChanged(propertyName="IsActive") (source line information unavailable) 3. MyCompany.Windows.Contracts.dll#0!MyCompany.Windows.ViewModel.Window.WindowViewModel.set_IsActive(value=True) (source line information unavailable) 4. MyCompany.Windows.dll#0!MyCompany.Windows.ViewModel.Window.IsActiveBinding.OnWindowIsActiveChanged(sender=MyCompany.Xpf.Views.XpfRibbonShell.XpfRibbonShellView, e=System.EventArgs) (source line information unavailable) 5. WindowsBase.dll#0!MS.Internal.ComponentModel.PropertyChangeTracker.OnPropertyInvalidation(d=, args= ) (source line information unavailable) 6. WindowsBase.dll#0!System.Windows.DependentList.InvalidateDependents(source= , sourceArgs= ) (source line information unavailable) 7. WindowsBase.dll#0!System.Windows.DependencyObject.NotifyPropertyChange(args= ) (source line information unavailable) 8. WindowsBase.dll#0!System.Windows.DependencyObject.UpdateEffectiveValue(entryIndex= , dp= , metadata= , oldEntry= , newEntry= , coerceWithDeferredReference= , coerceWithCurrentValue= , operationType= ) (source line information unavailable) 9. WindowsBase.dll#0!System.Windows.DependencyObject.SetValueCommon(dp= , value= , metadata= , coerceWithDeferredReference= , coerceWithCurrentValue= , operationType= , isInternal= ) (source line information unavailable) 10. WindowsBase.dll#0!System.Windows.DependencyObject.SetValue(key= , value= ) (source line information unavailable) 11. PresentationFramework.dll#0!System.Windows.Window.HandleActivate(windowActivated= ) (source line information unavailable) 12. PresentationFramework.dll#0!System.Windows.Window.WmActivate(wParam= ) (source line information unavailable) 13. PresentationFramework.dll#0!System.Windows.Window.WindowFilterMessage(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 14. PresentationCore.dll#0!System.Windows.Interop.HwndSource.PublicHooksFilterMessage(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 15. WindowsBase.dll#0!MS.Win32.HwndWrapper.WndProc(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 16. WindowsBase.dll#0!MS.Win32.HwndSubclass.DispatcherCallbackOperation(o= ) (source line information unavailable) 17. WindowsBase.dll#0!System.Windows.Threading.ExceptionWrapper.InternalRealCall(callback= , args= , numArgs= ) (source line information unavailable) 18. WindowsBase.dll#0!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(source=System.Windows.Threading.Dispatcher, method= , args= , numArgs= , catchHandler= ) (source line information unavailable) 19. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.WrappedInvoke(callback= , args= , numArgs= , catchHandler= ) (source line information unavailable) 20. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.InvokeImpl(priority= , timeout= , method= , args= , numArgs= ) (source line information unavailable) 21. WindowsBase.dll#0!MS.Win32.HwndSubclass.SubclassWndProc(hwnd= , msg= , wParam= , lParam= ) (source line information unavailable) [IL Method without Metadata] 22. WindowsBase.dll#0!MS.Internal.ReaderWriterLockWrapper.get_ReadLock() (source line information unavailable) 23. WindowsBase.dll#0!System.ComponentModel.PropertyChangedEventManager.OnPropertyChanged(sender=MyCompany.Windows.ViewModel.Window.WindowViewModel, args=System.ComponentModel.PropertyChangedEventArgs) (source line information unavailable) 24. MyCompany.Windows.Contracts.dll#0!MyCompany.Windows.ViewModel.Model.ViewModelItemBase.NotifyPropertyChanged(propertyName="IsActive") (source line information unavailable) 25. MyCompany.Windows.Contracts.dll#0!MyCompany.Windows.ViewModel.Window.WindowViewModel.set_IsActive(value=False) (source line information unavailable) 26. MyCompany.Windows.dll#0!MyCompany.Windows.ViewModel.Window.IsActiveBinding.OnWindowIsActiveChanged(sender=MyCompany.Xpf.Views.XpfRibbonShell.XpfRibbonShellView, e=System.EventArgs) (source line information unavailable) 27. WindowsBase.dll#0!MS.Internal.ComponentModel.PropertyChangeTracker.OnPropertyInvalidation(d= , args= ) (source line information unavailable) 28. WindowsBase.dll#0!System.Windows.DependentList.InvalidateDependents(source= , sourceArgs= ) (source line information unavailable) 29. WindowsBase.dll#0!System.Windows.DependencyObject.NotifyPropertyChange(args= ) (source line information unavailable) 30. WindowsBase.dll#0!System.Windows.DependencyObject.UpdateEffectiveValue(entryIndex= , dp= , metadata= , oldEntry= , newEntry= , coerceWithDeferredReference= , coerceWithCurrentValue= , operationType= ) (source line information unavailable) 31. WindowsBase.dll#0!System.Windows.DependencyObject.SetValueCommon(dp= , value= , metadata= , coerceWithDeferredReference= , coerceWithCurrentValue= , operationType= , isInternal= ) (source line information unavailable) 32. WindowsBase.dll#0!System.Windows.DependencyObject.SetValue(key= , value= ) (source line information unavailable) 33. PresentationFramework.dll#0!System.Windows.Window.HandleActivate(windowActivated= ) (source line information unavailable) 34. PresentationFramework.dll#0!System.Windows.Window.WmActivate(wParam= ) (source line information unavailable) 35. PresentationFramework.dll#0!System.Windows.Window.WindowFilterMessage(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 36. PresentationCore.dll#0!System.Windows.Interop.HwndSource.PublicHooksFilterMessage(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 37. WindowsBase.dll#0!MS.Win32.HwndWrapper.WndProc(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 38. WindowsBase.dll#0!MS.Win32.HwndSubclass.DispatcherCallbackOperation(o= ) (source line information unavailable) 39. WindowsBase.dll#0!System.Windows.Threading.ExceptionWrapper.InternalRealCall(callback= , args= , numArgs= ) (source line information unavailable) 40. WindowsBase.dll#0!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(source=System.Windows.Threading.Dispatcher, method= , args= , numArgs= , catchHandler= ) (source line information unavailable) 41. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.WrappedInvoke(callback= , args= , numArgs= , catchHandler= ) (source line information unavailable) 42. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.InvokeImpl(priority= , timeout= , method= , args= , numArgs= ) (source line information unavailable) 43. WindowsBase.dll#0!MS.Win32.HwndSubclass.SubclassWndProc(hwnd= , msg= , wParam= , lParam= ) (source line information unavailable) [IL Method without Metadata] 44. WindowsBase.dll#0!MS.Internal.ReaderWriterLockWrapper.get_ReadLock() (source line information unavailable) 45. WindowsBase.dll#0!System.ComponentModel.PropertyChangedEventManager.OnPropertyChanged(sender=MyCompany.Windows.ViewModel.Window.WindowViewModel, args=System.ComponentModel.PropertyChangedEventArgs) (source line information unavailable) 46. MyCompany.Windows.Contracts.dll#0!MyCompany.Windows.ViewModel.Model.ViewModelItemBase.NotifyPropertyChanged(propertyName="IsActive") (source line information unavailable) 47. MyCompany.Windows.Contracts.dll#0!MyCompany.Windows.ViewModel.Window.WindowViewModel.set_IsActive(value=True) (source line information unavailable) 48. MyCompany.Windows.dll#0!MyCompany.Windows.ViewModel.Window.IsActiveBinding.OnWindowIsActiveChanged(sender=MyCompany.Xpf.Views.XpfRibbonShell.XpfRibbonShellView, e=System.EventArgs) (source line information unavailable) 49. WindowsBase.dll#0!MS.Internal.ComponentModel.PropertyChangeTracker.OnPropertyInvalidation(d= , args= ) (source line information unavailable) 50. WindowsBase.dll#0!System.Windows.DependentList.InvalidateDependents(source= , sourceArgs= ) (source line information unavailable) 51. WindowsBase.dll#0!System.Windows.DependencyObject.NotifyPropertyChange(args= ) (source line information unavailable) 52. WindowsBase.dll#0!System.Windows.DependencyObject.UpdateEffectiveValue(entryIndex= , dp= , metadata= , oldEntry= , newEntry= , coerceWithDeferredReference= , coerceWithCurrentValue= , operationType= ) (source line information unavailable) 53. WindowsBase.dll#0!System.Windows.DependencyObject.SetValueCommon(dp= , value= , metadata= , coerceWithDeferredReference= , coerceWithCurrentValue= , operationType= , isInternal= ) (source line information unavailable) 54. WindowsBase.dll#0!System.Windows.DependencyObject.SetValue(key= , value= ) (source line information unavailable) 55. PresentationFramework.dll#0!System.Windows.Window.HandleActivate(windowActivated= ) (source line information unavailable) 56. PresentationFramework.dll#0!System.Windows.Window.WmActivate(wParam= ) (source line information unavailable) 57. PresentationFramework.dll#0!System.Windows.Window.WindowFilterMessage(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 58. PresentationCore.dll#0!System.Windows.Interop.HwndSource.PublicHooksFilterMessage(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 59. WindowsBase.dll#0!MS.Win32.HwndWrapper.WndProc(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 60. WindowsBase.dll#0!MS.Win32.HwndSubclass.DispatcherCallbackOperation(o= ) (source line information unavailable) 61. WindowsBase.dll#0!System.Windows.Threading.ExceptionWrapper.InternalRealCall(callback= , args= , numArgs= ) (source line information unavailable) 62. WindowsBase.dll#0!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(source=System.Windows.Threading.Dispatcher, method= , args= , numArgs= , catchHandler= ) (source line information unavailable) 63. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.WrappedInvoke(callback= , args= , numArgs= , catchHandler= ) (source line information unavailable) 64. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.InvokeImpl(priority= , timeout= , method= , args= , numArgs= ) (source line information unavailable) 65. WindowsBase.dll#0!MS.Win32.HwndSubclass.SubclassWndProc(hwnd= , msg= , wParam= , lParam= ) (source line information unavailable) [IL Method without Metadata] 66. WindowsBase.dll#0!System.ComponentModel.PropertyChangedEventManager.PrivateAddListener(source= , listener= , propertyName= ) (source line information unavailable) 67. PresentationFramework.dll#0!MS.Internal.Data.PropertyPathWorker.ReplaceItem(k= , newO= , parent= ) (source line information unavailable) 68. PresentationFramework.dll#0!MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(k= , collectionView= , newValue= , isASubPropertyChange= ) (source line information unavailable) 69. PresentationFramework.dll#0!MS.Internal.Data.ClrBindingWorker.AttachDataItem() (source line information unavailable) 70. PresentationFramework.dll#0!System.Windows.Data.BindingExpression.Activate(item= ) (source line information unavailable) 71. PresentationFramework.dll#0!System.Windows.Data.BindingExpression.AttachToContext(attempt= ) (source line information unavailable) 72. PresentationFramework.dll#0!System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(lastChance= ) (source line information unavailable) 73. PresentationFramework.dll#0!MS.Internal.Data.DataBindEngine+Task.Run(lastChance= ) (source line information unavailable) 74. PresentationFramework.dll#0!MS.Internal.Data.DataBindEngine.Run(arg= ) (source line information unavailable) 75. PresentationFramework.dll#0!MS.Internal.Data.DataBindEngine.OnLayoutUpdated(sender= , e= ) (source line information unavailable) 76. PresentationCore.dll#0!System.Windows.ContextLayoutManager.fireLayoutUpdateEvent() (source line information unavailable) 77. PresentationCore.dll#0!System.Windows.ContextLayoutManager.UpdateLayout() (source line information unavailable) 78. PresentationCore.dll#0!System.Windows.ContextLayoutManager.UpdateLayoutCallback(arg= ) (source line information unavailable) 79. PresentationCore.dll#0!System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() (source line information unavailable) 80. PresentationCore.dll#0!System.Windows.Media.MediaContext.RenderMessageHandlerCore(resizedCompositionTarget= ) (source line information unavailable) 81. PresentationCore.dll#0!System.Windows.Media.MediaContext.RenderMessageHandler(resizedCompositionTarget= ) (source line information unavailable) 82. WindowsBase.dll#0!System.Windows.Threading.ExceptionWrapper.InternalRealCall(callback= , args= , numArgs= ) (source line information unavailable) 83. WindowsBase.dll#0!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(source=System.Windows.Threading.Dispatcher, method= , args= , numArgs= , catchHandler= ) (source line information unavailable) 84. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.WrappedInvoke(callback= , args= , numArgs= , catchHandler= ) (source line information unavailable) 85. WindowsBase.dll#0!System.Windows.Threading.DispatcherOperation.InvokeImpl() (source line information unavailable) 86. mscorlib.dll#0!System.Threading.ExecutionContext.runTryCode(userData= ) (source line information unavailable) 87. mscorlib.dll#0!System.Threading.ExecutionContext.Run(executionContext= , callback= , state= , ignoreSyncCtx= ) (source line information unavailable) 88. mscorlib.dll#0!System.Threading.ExecutionContext.Run(executionContext= , callback= , state= ) (source line information unavailable) 89. WindowsBase.dll#0!System.Windows.Threading.DispatcherOperation.Invoke() (source line information unavailable) 90. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.ProcessQueue() (source line information unavailable) 91. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.WndProcHook(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 92. WindowsBase.dll#0!MS.Win32.HwndWrapper.WndProc(hwnd= , msg= , wParam= , lParam= , handled= ) (source line information unavailable) 93. WindowsBase.dll#0!MS.Win32.HwndSubclass.DispatcherCallbackOperation(o= ) (source line information unavailable) 94. WindowsBase.dll#0!System.Windows.Threading.ExceptionWrapper.InternalRealCall(callback= , args= , numArgs= ) (source line information unavailable) 95. WindowsBase.dll#0!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(source=System.Windows.Threading.Dispatcher, method= , args= , numArgs= , catchHandler= ) (source line information unavailable) 96. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.WrappedInvoke(callback= , args= , numArgs= , catchHandler= ) (source line information unavailable) 97. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.InvokeImpl(priority= , timeout= , method= , args= , numArgs= ) (source line information unavailable) 98. WindowsBase.dll#0!MS.Win32.HwndSubclass.SubclassWndProc(hwnd= , msg= , wParam= , lParam= ) (source line information unavailable) [IL Method without Metadata] [Internal Frame, 'M-->U'] [IL Method without Metadata] 99. WindowsBase.dll#0!System.Windows.Threading.Dispatcher.PushFrameImpl(frame= ) (source line information unavailable) 100. PresentationFramework.dll#0!System.Windows.Application.RunInternal(window=