WPF WebBrowser甚至在使用ObjectForScripting

时间:2016-02-16 03:53:29

标签: javascript c# wpf multithreading webbrowser-control

在我们的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对象(在处理程序中)。

1 个答案:

答案 0 :(得分:1)

好的,所以我想出答案,结果是我在UI线程上初始化COM对象(与设备交互的对象),当我在COM对象中调用它在UI上运行的方法时线程。

将COM对象的声明移到同一个线程中有帮助。

作为旁注,还有一点是创建COM对象和单独的线程,然后在单独的线程上调用该方法。

感谢所有查看问题的人。