我有一个简单的WPF应用程序,该应用程序托管插件(假定标准窗口的内容设置为HWndHost)。
我正在使用HWndHost托管插件,插件可以位于同一进程,不同的应用程序域或不同的进程中。
在此示例中,我们采用不同的过程。
我在外接程序过程中产生了一个新窗口,并将其更改为WPF宿主窗口的子窗口,因此显示效果很好。
让我们假设我有两个插件,它们与主机的处理过程不同。当UI线程在这些进程之一中阻塞时,主宿主UI线程将被阻塞,并且该应用程序将无响应(请参阅观察结果)。我该如何避免呢?
假设我在两个插件中都有一个调度程序计时器,该计时器会更新在文本块的插件视图中显示的计数器。
还假定每个插件视图中都有一个执行Thread.Sleep的按钮。
当我按下按钮时,该插件视图中的计时器停止(如预期的那样)。另一个小部件将继续更新(这是我期望的)。如果我尝试移动窗口或将焦点放在窗口的任何部分上,则整个对象将锁定(即不移动,并且两个计时器都停止计时),直到睡眠完成。这就是我要避免的。
我怀疑发生这种情况,因为在互操作中调用SetParent时,它会在后台调用AttachThreadInput,后者为进程共享相同的输入队列。
有什么想法吗?