在调用绑定(bind)到 WPF Web 浏览器控件的 ObjectForScripting 上的方法时,网页 UI 锁定出现奇怪的问题。进一步的调查使我们意识到整个 UI(包括 WPF 应用程序而不仅仅是 Web 浏览器)都被锁定。
使用的技术是 WPF w/Caliburn.Micro 和 Autofac。我使用 COM 可见类上的方法来推送到 Caliburn.Micro 提供的事件聚合器。当进行此调用时,网页会锁定,即使我们调用 PublishOnBackgroundThread 并且该事件的处理程序会立即启动一个新线程。
脚本对象:
[ComVisible(true)]
public class ScriptBridge
{
public void messageHost(string eventName, string eventPayload)
{
events.PublishOnBackgroundThread(new MessageFromUi(eventName, eventPayload));
}
}
处理程序
public void Handle(MessageFromUi message)
{
Task.Factory.StartNew(() => { var result = ComObjectCall(); /* do more processing */ });
}
我可以提到的一件事是,在新线程的操作中,它确实调用了另一个 COM 对象。当我用 10 秒延迟替换此 COM 调用时,UI 不会锁定。
此外,我尝试使用 Task.Run 和更明确的创建 Thread 对象。
不幸的是,我无法直接从 JavaScript 调用 COM 对象(在处理程序内)。
最佳答案
好吧,我找到了答案,事实证明我正在 UI 线程上初始化 COM 对象(与设备交互的对象),当我调用 COM 对象中的方法时,它正在 UI 上运行线程。
将 COM 对象的声明移至同一线程内会有所帮助。
顺便说一句,创建 COM 对象和一个单独的线程,然后在单独的线程上调用该方法也很有效。
感谢所有查看这些问题的人。
关于javascript - WPF WebBrowser 甚至在使用 ObjectForScripting 的单独线程上锁定 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35423403/