gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:20:21 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com