在我们的ObjectForScripting上调用绑定到WPF Web浏览器控件的方法时,网页UI锁定有一个奇怪的问题。进一步的调查使我们意识到整个UI,包括WPF应用程序而不仅仅是WebBrowser,都会锁定。
使用的技术是WPF w / Caliburn.Micro& Autofac。我在COM可见类上使用方法来推送到Caliburn.Micro提供的事件聚合器。当进行此调用时,Web页面锁定,即使我们调用PublishOnBackgroundThread&事件的处理程序立即启动一个新线程。
ObjectForScripting:
[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对象(在处理程序中)。
答案 0 :(得分:1)
好的,所以我想出答案,结果是我在UI线程上初始化COM对象(与设备交互的对象),当我在COM对象中调用它在UI上运行的方法时线程。
将COM对象的声明移到同一个线程中有帮助。
作为旁注,还有一点是创建COM对象和单独的线程,然后在单独的线程上调用该方法。
感谢所有查看问题的人。