2010-06-17 36 views
0

我嘗試使用此代碼:C#InvalidCastException的

webBrowser.Document.GetElementById("login").SetAttribute("value", "user"); 

它的工作很好,但不是當我用它在一個新的線程。我得到一個InvalidCastException。我能做什麼 ?

+0

請上傳你的異常消息的全文。 – 2010-06-17 17:34:55

+0

「但不是當我在一個新的線程中使用它」。也許代碼需要在UI線程上執行?但是,這不應該拋出一個InvalidCastException ... – dtb 2010-06-17 17:38:25

+0

另一個問題是'你爲什麼使用單獨的線程?'。爲什麼不能在主線程中完成這項工作?這會減少你的線程數量,並簡化你的問題。 – 2010-06-17 17:48:09

回答

0

webBrowser必須是GUI元素,並且大多數GUI元素不能很好地處理多線程。通常應該只在應用程序的主UI線程上訪問GUI對象。

將調用委託給UI線程的最簡單方法是使用Dispatcher.Invoke

+1

'Dispatcher.Invoke'似乎很漂亮的WPF特定... – leppie 2010-06-17 17:39:19

+0

好的謝謝,但我是初學者,你能給我一個webbrowser的例子嗎? – krisox 2010-06-17 17:42:11

+0

@leppie:我幾乎說過,但後來我看到Dispatcher是在WindowsBase.dll中,而不像所有其他WPF的東西一樣,PresentationFramework.dll。 – Powerlord 2010-06-17 17:50:21

0

這應該工作:

delegate void ActionExecutorOnUI(ref HtmlElement a, string b, string c); 
private void SetValueOnHtmlElementOnUIThread(this HtmlElement onElement, string propToChange, string valueGiven, WebBrowser linkToWebBrowser) 
     { 
      if (linkToWebBrowser.InvokeRequired) 
      { 
       ActionExecutorOnUI d = new ActionExecutorOnUI(SetValueOnHtmlElementOnUIThread); 
       linkToWebBrowser.Invoke(d, new object[] { }); 
      } 
      else 
       SetValueOnHtmlElementOnUIThread(ref onElement, propToChange, valueGiven); 

     } 

private void SetValueOnHtmlElementOnUIThread(ref HtmlElement onElement, string propToChange, string valueGiven) 
     { 
      onElement.SetAttribute("value", "user"); 
     }