私は自分のプログラムがどのように機能しているかに困惑しています.inがループ内で非同期に実行webBrowser2.Navigate(Url);
されるように、スレッドを使用しています(別のスタックオーバーフローの回答からそうするように言われました) .これはすべて正常に動作します.TestScenarios()
while
GetScenarios()
WebBrowser
ここで、コントロール内に JavaScript を挿入して実行するためのコードのチャンクを追加しました。ただし、.... 行を呼び出すたびにHtmlElement head = webBrowser2.Document
、「指定されたキャストは有効なエラーではありません」というメッセージが表示されます。
このエラーはWebBrowser
、別の UI スレッドでアクセスされているコントロールと関係があり、そのように動作できないことはわかっていますが、それが何を意味し、どのように修正できるかについて混乱しています。
さらにコンテキストが必要な場合は、コメントしてください。
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");
}