我们有一个嵌入在WinForms控件中的WPF控件,该控件最终作为ActiveX控件在第三方开发的C++应用程序中使用。但是,在某些情况下,ActiveX控件的UI会冻结,而C++应用程序的其余部分则正常运行。经过调试,发现在每次调用Application.Current.Dispatcher.Invoke时,WPF控件都会被阻塞,然而WinForms控件能够处理Control.Invoke的调用。每当我暂停调试器时,都可以看到UI线程正在C++应用程序中执行一些工作,但似乎没有被阻塞或等待任何内容。就好像UI线程突然无法执行WPF代理一样。
当C++应用程序长时间独占UI线程(几分钟)时,WPF控件有时会进入此状态。虽然我不负责C++应用程序所做的事情,但第一件事应该是为这样的耗时任务使用不同的线程。无论如何,这并不是导致WPF控件表现出这种方式的原因。我不知道如何解决这个问题,希望得到帮助。
当C++应用程序长时间独占UI线程(几分钟)时,WPF控件有时会进入此状态。虽然我不负责C++应用程序所做的事情,但第一件事应该是为这样的耗时任务使用不同的线程。无论如何,这并不是导致WPF控件表现出这种方式的原因。我不知道如何解决这个问题,希望得到帮助。
Invoke
而不是BeginInvoke
时可能会遇到死锁问题——尽管这是针对WinForms而非WPF的。Dispatcher.Invoke
/BeginInvoke
同样适用。框架方法在许多你无法控制的地方进行了锁定,导致类似的情况。你试过使用Dispatcher.BeginInvoke
吗? - Peter Ritchie