-1

button1 クリック イベントでは、リストボックスで選択したアイテムの数に応じて、多数のバックグラウンド ワーカーを作成します。

    private void button1_Click(object sender, EventArgs e)
    {
        // For each item selected in the listbox
        foreach (var item in listBox1.SelectedItems)
        {
            BackgroundWorker worker = new BackgroundWorker();
            worker.DoWork += backgroundWorker1_DoWork;
            worker.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
            object argument = item;
            worker.RunWorkerAsync(argument);
        }

        offlineOnline = false;
        init();
        button1.Enabled = false;
        this.Text = "Processing...";
        label6.Text = "Processing...";
        label6.Visible = true;
        button2.Enabled = false;
        checkBox1.Enabled = false;
        checkBox2.Enabled = false;
        numericUpDown1.Enabled = false;
        button3.Enabled = true;
        button6.Enabled = false;
        button4.Enabled = true;
        button5.Enabled = false;
        listBox1.Enabled = false;
    }
}

次に、DoWork イベントで、次のようなスレッドを使用しています。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    object input = e.Argument;
    string f = GetUrl(input);
    this.Invoke(new MethodInvoker(delegate { label2.Text = "Website To Crawl: "; }));
    this.Invoke(new MethodInvoker(delegate { label4.Text = f; }));
    if (offlineOnline == true)
    {
        offlinecrawling(f, levelsToCrawl, e);
    }
    else
    {
        webCrawler(f, levelsToCrawl, e);
    }
}

問題は、label4.Text に 2 つのスレッドからの最後の URL が表示されることです。たとえば、2 つの異なるラベルが必要です。それぞれが他のスレッドを表示します。たとえば、label4.Text には www.cnn.com があり、label7.Text には www.cnet.com があります。

各スレッドの URL をキャッチまたは取得してラベルに入れる方法がわかりません。

4

1 に答える 1

1

はい、最初にコントロールの名前を変更することをお勧めします-@Henk_Holtermanが提案したように。たとえば、引数として入力だけでなく、更新する入力 + ラベルを持つクラス/ペアを渡すことができます。次に、デリゲートを更新して、指定されたラベルを使用します。

于 2013-03-18T08:54:05.077 に答える