1

私は、スレッドで実行する必要があるプロジェクトに取り組んでいます。

私は仕事をするバックグラウンドワーカーを持っています。私が達成したいのは、 を押すButton3と、バックグラウンド ワーカーが再起動することです。バックグラウンド ワーカーがしばらく終了するのを待ちましBackgroundworker1.IsBusyたが、これは決して終わりません。を押すとButton3、エラーが発生します

この BackgroundWorker は現在ビジーで、複数のタスクを同時に実行できません

これは私のコードです:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        backgroundWorker1.CancelAsync();
    }

    private void button3_Click_1(object sender, EventArgs e)
    {
        backgroundWorker1.CancelAsync();
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        int x = 0, y = 0, result;

        while (true)
        {
            if (backgroundWorker1.CancellationPending)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                x++;
                y++;
                result = x + y;
                this.label1.Invoke(new MethodInvoker(() => this.label1.Text =     result.ToString()));
            }
        }
    }

}//public partial class Form1 : Form
4

2 に答える 2

3

完了したイベントをリッスンし、そこでワーカーを再起動します -

private bool restartOnCancel = false;

private void button3_Click_1(object sender, EventArgs e)
{
    restartOnCancel = true;
    backgroundWorker1.CancelAsync();
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if ((e.Cancelled == true) && restartOnCancel)
    {
        restartOnCancel = false;
        backgroundWorker1.RunWorkerAsync();
    }
}
于 2013-06-21T18:27:13.283 に答える