我嘗試使用此代碼:C#InvalidCastException的
webBrowser.Document.GetElementById("login").SetAttribute("value", "user");
它的工作很好,但不是當我用它在一個新的線程。我得到一個InvalidCastException。我能做什麼 ?
我嘗試使用此代碼:C#InvalidCastException的
webBrowser.Document.GetElementById("login").SetAttribute("value", "user");
它的工作很好,但不是當我用它在一個新的線程。我得到一個InvalidCastException。我能做什麼 ?
webBrowser
必須是GUI元素,並且大多數GUI元素不能很好地處理多線程。通常應該只在應用程序的主UI線程上訪問GUI對象。
將調用委託給UI線程的最簡單方法是使用Dispatcher.Invoke。
這應該工作:
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");
}
請上傳你的異常消息的全文。 – 2010-06-17 17:34:55
「但不是當我在一個新的線程中使用它」。也許代碼需要在UI線程上執行?但是,這不應該拋出一個InvalidCastException ... – dtb 2010-06-17 17:38:25
另一個問題是'你爲什麼使用單獨的線程?'。爲什麼不能在主線程中完成這項工作?這會減少你的線程數量,並簡化你的問題。 – 2010-06-17 17:48:09