我正在使用 AddPropertyChangedEventHandler 根据http://msdn.microsoft.com/en-us/library/ms752286(v=vs.110).aspx订阅窗口事件
但是,如果目标窗口挂起或冻结(不幸的是,这种情况经常发生),我的整个应用程序也会挂起。
克服这个问题的最佳方法是什么?
(C#、.NET 4.5、WPF)
我正在使用 AddPropertyChangedEventHandler 根据http://msdn.microsoft.com/en-us/library/ms752286(v=vs.110).aspx订阅窗口事件
但是,如果目标窗口挂起或冻结(不幸的是,这种情况经常发生),我的整个应用程序也会挂起。
克服这个问题的最佳方法是什么?
(C#、.NET 4.5、WPF)
看:
尝试从 STA 线程安装事件处理程序会导致死锁,因为 UIA 会尝试回调 STA 线程以通知它新的事件处理程序。
据此,我认为您需要订阅不同线程(即不是您的 UI 线程)上的事件......它应该是初始化为使用 COM MTA(多线程单元)线程模型的事件...... .而是在您的 UI 的 STA 线程上执行此操作。
然后Invoke
回到你的 UI 线程,当你在后台 MTA 线程上获得事件时(我建议使用BeginInvoke
而不是Invoke
回调你的 UI 线程上的委托以避免可能的死锁)。