0

私は自分のプログラムがどのように機能しているかに困惑しています.inがループ内で非同期に実行webBrowser2.Navigate(Url);されるように、スレッドを使用しています(別のスタックオーバーフローの回答からそうするように言われました) .これはすべて正常に動作します.TestScenarios()whileGetScenarios()

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");
    }
4

3 に答える 3

2

ドキュメントが読み込まれる前に webBrowser の要素にアクセスしているため、この問題に直面しています。このコードを移動する必要があります

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

イベント。

于 2013-07-29T16:21:39.743 に答える
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
}
于 2013-07-29T16:15:13.843 に答える