0

重複の可能性:
新しいスレッドの WebBrowser コントロール

Web ページ上の特定の要素のクリックを自動化し、クリックするたびに新しい IE ウィンドウを生成しようとしています。

以下のコードは、クリックする必要がある要素 ID を含む 1 つの列を持つ DataTable を読み取ります。次に、テーブルを循環し、Webbrowser で必要な要素をクリックしますwebNav.webBrowser1

コードは最初の実行時には正常に動作しますが、その後はクリック イベントは発生しません。ブレークポイントを使用してステップ実行すると、コードが問題なく正常に実行されていることがわかります。トリガーされないアクションをスケジュールしているように見えます。

スレッドを使用するのはこれが初めてなので、根本的に間違っている可能性があります。

現時点では、問題が何であるかについて少し困惑していますか?

[STAThread]
private void ClickOptions()
{
    DataTable _dataTableTestClone = new DataTable();
    _dataTableTestClone = _dataTableTest;

    if (_dataTableTest != null)
    {
        var thread = new Thread(() =>
        {
            foreach (DataRow row in _dataTableTestClone.Rows)
            {
                string getclickID = row["ID"].ToString();

                webNav.webBrowser1.Invoke(new Action(() =>
                {
                    HtmlElement lit = webNav.webBrowser1.Document.GetElementById(getclickID);
                    if (lit != null)
                    {
                        lit.InvokeMember("click");
                    }
                }));

                Thread.Sleep(2000);
            }
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.IsBackground = true;
        thread.Start();
    }
}
4

1 に答える 1

2

スレッドアパートメントの状態をSTAに設定するのはなぜですか?目的はないと思います。コントロールの作成または特定のCOMオブジェクトとの対話に使用するスレッドのみがSTAである必要があります(webBrowser1でのInvoke()呼び出しがアクションをUIスレッドにマーシャリングするため、ここから開始するスレッドではありません)。

Invokeの内側のコードをtry/catchでラップし、catchブロックの内側にブレークポイントを追加して、例外がポップアップするかどうかを確認できます。マルチスレッドシナリオの例外は、方法によっては少しおかしな動作をすることがあります。アプリケーションの残りの部分はセットアップされています。どこかで飲み込まれている例外が発生していることは間違いありません。

編集:スレッドの唯一の目的が、呼び出されたアクションの間に2秒の遅延を持たせることである場合、代わりにSystem.Windows.Forms.Timerを使用します。

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

于 2012-10-16T18:53:31.390 に答える