2013-07-29 9 views
0

我很困惑我的程序如何工作,我正在使用線程(被告知要從另一個堆棧溢出答案中這樣做),以便webBrowser2.Navigate(Url);TestScenarios()GetScenarios()while循環內異步運行。這一切工作正常。指定的演員表無效 - 在不同的用戶界面線程中訪問WebBrowser

現在,我添加的代碼塊注入和運行WebBrowser控制內部一些JavaScript,但每次我打電話HtmlElement head = webBrowser2.Document .. ..線,我得到「指定的演員是無效的錯誤。」

我知道這個錯誤有一些事情要做在單獨的UI線程中訪問WebBrowser控件,並且無法以這種方式工作,但我對這意味着什麼以及如何修復它感到困惑。

如果您需要更多上下文,只需發表評論。

public void GetScenarios() 
    { 
     new Thread(() => 
     { 
      while() { 
      ... 
      TestScenarios(); 
      } 
     }).Start(); 
    } 

    TestScenarios() { 
     ... 
     Action action =() => 
       { 
        webBrowser2.Tag = signal; 
        webBrowser2.Navigate(Url); 
        webBrowser2.DocumentCompleted -= WebBrowserDocumentCompleted; 
        webBrowser2.DocumentCompleted += WebBrowserDocumentCompleted; 
       }; 
       webBrowser2.Invoke(action); 
       signal.WaitOne(); 
     ... 
     //Run some javascript on the WebBrowser control 
     HtmlElement head = webBrowser2.Document.GetElementsByTagName("head")[0]; 
        HtmlElement scriptEl = webBrowser2.Document.CreateElement("script"); 
        IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement; 
        element.text = "function sayHello() { alert('hello') }"; 
        head.AppendChild(scriptEl); 
        webBrowser2.Document.InvokeScript("sayHello"); 
    } 

回答

2

您都面臨這個問題,因爲您在文檔加載前訪問web瀏覽器的元素。你應該將這段代碼

HtmlElement head = webBrowser2.Document.GetElementsByTagName("head")[0]; 
        HtmlElement scriptEl = webBrowser2.Document.CreateElement("script"); 
        IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement; 
        element.text = "function sayHello() { alert('hello') }"; 
        head.AppendChild(scriptEl); 
        webBrowser2.Document.InvokeScript("sayHello"); 

WebBrowserDocumentCompleted 

事件。

1

首先...你應該通過它真的介入調試器,找出你想投的對象是...這似乎並不像一個線程問題。

根據您的錯誤webBrowser2.Document.GetElementsByTagName("head")[0]不能轉換爲HtmlElement

你也可以嘗試這樣的事情看到的物體是什麼...

var head = webBrowser2.Document.GetElementsByTagName("head")[0] as HtmlElement; 
if (head == null) 
{ 
    Console.WriteLine(typeof(head); // output the object type somehow 
} 
+0

這裏有一些東西。首先,如果不爲空webBrowser2.Document.GetElementsByTagName(「head」)[0]可以轉換爲htmlelement。其次,不應該如果(head == null)是if(head!= null) – Ehsan

+0

@EhsanUllah不,你試圖將它轉換爲HtmlElement,但是如果失敗則返回head == null ......在這種情況下,你想寫出該對象實際上是爲了排除故障。 – Kevin

+0

那麼typeof(頭)會是什麼? – Ehsan

0

管理人在包裝的JS腳本塊來解決它:

webBrowser2.Invoke(new Action(() => 
{ 
    //...... 
} 
+0

這可能會暫時解決您的錯誤,但不是一個永久的解決方案。 – Ehsan

+0

檢查@EhsanUllah的答案......這可能是根本原因。 – Kevin

+0

爲什麼不呢?這不是永久的嗎?我監督什麼問題? –