[英]How does one determine if ObjectForScripting has been set for a WPF WebBrowser control from javascript?
[英]WPF WebBrowser locking UI even on separate thread using ObjectForScripting
在與WPF Web瀏覽器控件綁定的ObjectForScripting上調用方法時,網頁UI鎖定會出現一個奇怪的問題。 進一步的研究使我們意識到整個UI(包括WPF應用程序而不是WebBrowser)都已鎖定。
使用的技術是帶有Caliburn.Micro和Autofac的WPF。 我在COM可見類上使用method來推送到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和更明確的create Thread對象。
不幸的是,我不能直接從JavaScript調用COM對象(在處理程序內)。
好的,所以我想出了答案,原來是我正在UI線程上初始化COM對象(與設備交互的對象),而當我在COM Object中調用方法時,它正在UI線程上運行。
將COM對象的聲明移動到同一線程內有幫助。
另外,還可以創建COM對象和單獨的線程,然后在單獨的線程上調用方法。
感謝所有看過這些問題的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.