【问题标题】:C#, Background workerC#,后台工作者
【发布时间】:2011-09-19 21:20:55
【问题描述】:

我有一个使用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();
    }
}

【问题讨论】:

    标签: c# backgroundworker


    【解决方案1】:

    Canceled 属性仍然为 false,因为您跳出循环,然后允许后台工作人员的 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);
        }
    }
    

    区别很重要,因为有时您可能希望在检测到 CancellationPending 请求时回滚已经完成的工作,因此可能需要一段时间才能真正完成取消操作。

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 2011-03-17
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多