2

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

次のコントロールを含む Winforms アプリケーションを開発しています。テキスト ボックス、WebBrowser コントロール、および 3 つの Richtextboxes。

このアプリの目的は、テキスト ボックスに URL を入力すると、Web ブラウザーがそのページに移動し、Web ページの HTML ソースを解析してすべてのハイパーリンクを取得し、再びそれらのハイパーリンクをフィルター処理することです。有効および無効なハイパーリンク。

現在、私は別のスレッドで Web ブラウザー コントロールを宣言しています。Web ブラウザーのナビゲート イベントが発生すると、上記のすべての解析を行うスレッドをもう 1 つ作成します。問題は、別のスレッドから呼び出しているにもかかわらず、Web ブラウザが Web ページをロードしているときにアプリケーションが応答しなくなることです。

これに対する回避策はありますか?

これは、Web ブラウザー コントロール用の別のスレッドを作成するためのコードです。

Thread t2 = null;

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
        if (e.KeyChar == (char)13)
        {
            if((textBox1.Text.StartsWith("www") || textBox1.Text.StartsWith("WWW")))
            {
               textBox1.Text = textBox1.Text.Insert(0,"http://");

            }
            if (!(textBox1.Text.EndsWith(".html") || textBox1.Text.EndsWith(".htm")))
            {
                textBox1.Text = textBox1.Text + "/";
            }
            t2 = new Thread(new ParameterizedThreadStart(ActivateBrowser));
            t2.IsBackground = true;
            t2.SetApartmentState(ApartmentState.STA);
            t2.Start(textBox1.Text);
        }
    }

    public void ActivateBrowser(Object URL)
    {
        String url = (string)URL;
        WebBrowserNavigation(url);            
    }

    public delegate void PassURLDelegate(string URL);

    public void WebBrowserNavigation(string URL)
    {
        if (webBrowser1.InvokeRequired)
        {
            this.BeginInvoke(new PassURLDelegate(WebBrowserNavigation), new object[] { URL });
        }
        else
        {
            webBrowser1.Navigate(URL);
        }
    }
4

0 に答える 0