2010-06-17 35 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"); 
     }