1

が含まれているバックグラウンドワーカーをキャンセルするのに問題がありThread.Sleep(100)ます。

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
        int count;
        try
        {
            count = int.Parse(textBox3.Text);

            for (int i = 0; i < count; i++)
            {
                backgroundWorker1.ReportProgress((int)(((double)(i + 1) / count) * 1000));
                //Computation code
                Thread.Sleep(int.Parse(textBox4.Text));
            }
        }
        catch (Exception ex)
        {
            request.DownloadData(url);
            MessageBox.Show(ex.Message);
        }
}

private void cancel_Click(object sender, EventArgs e)
{
    backgroundWorker1.CancelAsync();
    progressBar1.Value = 0;
}

削除するThread.Sleep(100)とキャンセルは機能しますが、それ以外の場合は続行されます(プログレスバーは停止しません)。

編集:残りのコードを追加しました

4

2 に答える 2

6

CancelAsyncを呼び出すと、呼び出さCancellationPendingれたプロパティがtrueに設定されるだけです。これで、バックグラウンドワーカーは、このフラグがtrueであるかどうかを定期的にチェックして、操作を正常に終了することができます。したがって、バックグラウンドタスクを分割して、キャンセルを確認できるようにする必要があります。

private void DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        while(true)
        {
            if(worker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            Thread.Sleep(100);
        }
    }
于 2011-10-14T10:25:01.383 に答える
0

バックグラウンドスレッドをキャンセルする場合は、Thread.Interruptを使用してWaitSleepJoin状態を終了します。

http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt.aspx

于 2011-10-14T10:24:18.967 に答える