WPF WebBrowser 锁定 UI 即使在单独的线程上使用 ObjectForScripting
WPF WebBrowser locking UI even on separate thread using ObjectForScripting
在我们的 ObjectForScripting 上调用绑定到 WPF Web 浏览器控件的方法时,网页 UI 锁定有一个奇怪的问题。进一步调查让我们意识到整个 UI,包括 WPF 应用程序,而不仅仅是 WebBrowser,都锁定了。
使用的技术是带 Caliburn.Micro 和 Autofac 的 WPF。我在 COM 可见 class 上使用方法推送到 Caliburn.Micro 提供的事件聚合器。当进行此调用时,网页会锁定,即使我们调用 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 对象(在处理程序中)
好的,所以我找到了答案,事实证明我正在 UI 线程上初始化 COM 对象(与设备交互的对象),当我调用 COM 对象中的方法时它是 UI 线程上的 运行。
将 COM 对象的声明移动到同一线程内有帮助。
附带说明一下,同样有效的是创建 COM 对象和一个单独的线程,然后也在一个单独的线程上调用该方法。
感谢所有看过问题的人。
在我们的 ObjectForScripting 上调用绑定到 WPF Web 浏览器控件的方法时,网页 UI 锁定有一个奇怪的问题。进一步调查让我们意识到整个 UI,包括 WPF 应用程序,而不仅仅是 WebBrowser,都锁定了。
使用的技术是带 Caliburn.Micro 和 Autofac 的 WPF。我在 COM 可见 class 上使用方法推送到 Caliburn.Micro 提供的事件聚合器。当进行此调用时,网页会锁定,即使我们调用 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 对象(在处理程序中)好的,所以我找到了答案,事实证明我正在 UI 线程上初始化 COM 对象(与设备交互的对象),当我调用 COM 对象中的方法时它是 UI 线程上的 运行。
将 COM 对象的声明移动到同一线程内有帮助。
附带说明一下,同样有效的是创建 COM 对象和一个单独的线程,然后也在一个单独的线程上调用该方法。
感谢所有看过问题的人。