javascript - WPF WebBrowser 甚至在使用 ObjectForScripting 的单独线程上锁定 UI

标签 javascript c# wpf multithreading webbrowser-control

在调用绑定(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/

相关文章:

javascript - 我如何从 AngularJS 中的编译中获得 promise ?

c# - WPF 图像到字节[]

wpf - F# 异步显示 WPF 窗口

javascript - 如何将任何图像转换为 webp?

javascript - 如何检查javascript的构造

c# - 当指定 "new"事件时,如何使用 -= 删除事件处理程序

c# - c# 类中属性的最佳语法

wpf 触发器 Datagrid RowCount

javascript - 在 D3 定向力布局中循环遍历额外数据

c# - 将名称拆分为字段?