簡體   English   中英

WPF WebBrowser甚至使用ObjectForScripting在單獨的線程上鎖定UI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM