1

編集:この質問の一部はすでに他の場所で回答されていますが、このスレッドはさらに情報を提供し、知っておくと便利かもしれません

タイトルはほとんどすべてを述べていますが、ここにいくつかの詳細情報があります:

グローバル WebbBowser オブジェクトの HTMLdocument を使用して特定のオブジェクト (つまり、テキスト ボックス) を検索する関数があります。オブジェクトが見つかると、値が与えられます。

関数は次のようになります。

    public static void Set_Elements_Input(string element_name, string value)
    {
        HtmlElementCollection hec = _wb.Document.GetElementsByTagName("input");

        foreach (HtmlElement he in hec)
        {
            if (he.GetAttribute("name") == element_name)
            {
                he.SetAttribute("value", value);
            }
        }
    }

状況により、プログラミング環境でデバッグできません。したがって、生成された.exeを実行して、動作するかどうかを確認する必要があります..動作しません。

プログラムがクラッシュし、クラッシュ レポートには、クラッシュの原因が InvalidcastException であることが示されています。

MessageBox.Show() メソッドの助けを借りて、すべてがうまくいかないポイントを見つけることができました。

       MessageBox.Show("I got here!");
       HtmlElementCollection hec = _wb.Document.GetElementsByTagName("input");
       MessageBox.Show("I didn't get here!");

これがどのように InvalidCastException をスローするのかがわからないので、これは奇妙に思えます。foreach がキャストで動作することは知っていますが、私のプログラムはそのコードに到達していないようです。それと、HTMLElementCollection は HTMLElements のコレクションであるため、InvalidCastException がどのように発生するかわかりません。コレクションが空の場合かもしれませんが、それには別の例外があると思います。

思ったよりも、スレッドを使用していて、呼び出しを使用する必要があるためかもしれません。しかしhttp://msdn.microsoft.com/en-us/library/system.windows.forms.htmlelementcollection.aspxは、HtmlElementCollections はスレッド セーフであると述べています (またはそれとは何の関係もありませんか?)。それと、関数は静的であるため、呼び出すことができるかどうかさえわかりません。

簡単に言えば、何が起こっているのですか?どうすれば修正できますか?

4

4 に答える 4

0

さて、私は答えを見て、問題を解決することができました。何らかの理由でスレッド化が問題です。HTMLElementsCollection はスレッド セーフですが、WebBrowser クラスはスレッド セーフではないため、呼び出す必要がありました。

    public static void Set_Elements_Input(string element_name, string value)
    {
        if (_wb.InvokeRequired)
        {
            _wb.Invoke(new Action(() => { Set_Elements_Input(element_name, value); }));
        }
        else
        {
            HtmlElementCollection hec = _wb.Document.GetElementsByTagName("input");

            foreach (HtmlElement he in hec)
            {
                if (he.GetAttribute("name") == element_name)
                {
                    he.SetAttribute("value", value);
                }
            }
        }
    }

しかし、元のコードが InvalidCastException をスローする理由を知っている人はいますか?

于 2013-04-24T07:30:39.813 に答える