在WPF中阻止外部进程UI线程时,HwndHost会阻止主机UI

时间:2018-07-26 13:32:00

标签: c# wpf interop hwndhost

上下文

我有一个简单的WPF应用程序,该应用程序托管插件(假定标准窗口的内容设置为HWndHost)。

我正在使用HWndHost托管插件,插件可以位于同一进程,不同的应用程序域或不同的进程中。

在此示例中,我们采用不同的过程。

我在外接程序过程中产生了一个新窗口,并将其更改为WPF宿主窗口的子窗口,因此显示效果很好。

问题

让我们假设我有两个插件,它们与主机的处理过程不同。当UI线程在这些进程之一中阻塞时,主宿主UI线程将被阻塞,并且该应用程序将无响应(请参阅观察结果)。我该如何避免呢?

观察

假设我在两个插件中都有一个调度程序计时器,该计时器会更新在文本块的插件视图中显示的计数器。

还假定每个插件视图中都有一个执行Thread.Sleep的按钮。

当我按下按钮时,该插件视图中的计时器停止(如预期的那样)。另一个小部件将继续更新(这是我期望的)。如果我尝试移动窗口或将焦点放在窗口的任何部分上,则整个对象将锁定(即不移动,并且两个计时器都停止计时),直到睡眠完成。这就是我要避免的。

疑似原因

我怀疑发生这种情况,因为在互操作中调用SetParent时,它会在后台调用AttachThreadInput,后者为进程共享相同的输入队列。

有什么想法吗?

0 个答案:

没有答案