C#,后台工作者

3
我有一个使用BackgroundWorker组件的WinForms应用程序示例。它可以正常工作,但是当我点击Cancel按钮以取消后台线程时,它并没有取消该线程。当我点击Cancel按钮调用.CancelAsync()方法时,在RunWorkerCompleted事件处理程序中,e.Cancelled属性始终保持为false。我认为当我点击Cancel按钮时,它应该被设置为true。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
       // Wait 100 milliseconds.
       Thread.Sleep(100);
       // Report progress.
       if (backgroundWorker1.CancellationPending == true)
       {
           //label1.Text = "Cancelled by user.";
           break;
        }

        backgroundWorker1.ReportProgress(i);
     }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Change the value of the ProgressBar to the BackgroundWorker progress.
    progressBar1.Value = e.ProgressPercentage;
    // Set the text.
    label1.Text = e.ProgressPercentage.ToString();
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled == true)
    {
        label1.Text = "Canceled!";
    }
    else if (e.Error != null)
    {
        label1.Text = "Error: " + e.Error.Message;
    }
    else
    {
         label1.Text = "Done!";
    }
}

private void button2_Click(object sender, EventArgs e)
{
    if (backgroundWorker1.WorkerSupportsCancellation == true)
    {
        // Cancel the asynchronous operation.
        backgroundWorker1.CancelAsync();
    }
}
1个回答

7

Cancelled属性仍然为false,因为你跳出了循环,然后允许backgroundworker的DoWork函数以正常的方式结束。你从未告诉你的backgroundworker组件,挂起的取消实际上被接受了。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        // Wait 100 milliseconds.
        Thread.Sleep(100);

        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
            break;
        }

        // Report progress.
        backgroundWorker1.ReportProgress(i);
    }
}

这个区别很重要,因为有时候当你检测到取消请求时,你可能想回滚已经完成的工作,所以在实际完成取消之前可能需要一段时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接