C#背景工人问题

时间:2011-06-07 14:33:52

标签: c# backgroundworker

我有一个后台工作者基本上做了以下几点:

  1. 查找下一个可用文件并将其标记为正在处理
  2. 处理文件并将更新后的版本另存为新文件
  3. 将原件标记为已处理
  4. 当有要处理的文件时,上述步骤需要循环并继续处理。

    我希望后台工作程序能够被停止,我看到了WorkerSupportsCancellation设置,但是如何确保它只能在文件之间停止,而不是在处理文件时?

2 个答案:

答案 0 :(得分:9)

WorkerSupportsCancellation设置为true,并定期检查CancellationPending事件处理程序中的DoWork属性。

CancelAsync方法仅设置CancellationPending属性。它不会杀死线程;工作人员可以回复取消请求。

e.g:

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    while( !myBackgroundWorker.CancellationPending )
    {
        // Process another file
    }
}

答案 1 :(得分:5)

您必须在文件处理结束时检查后台工作人员的CancellationPending procepty

    static void Main(string[] args)
            {
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.WorkerSupportsCancellation = true;
                bw.RunWorkerAsync();
                Thread.Sleep(5000);
                bw.CancelAsync();
                Console.ReadLine();
            }

            static void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                string[] files = new string[] {"", "" };
                foreach (string file in files)
                { 
                    if(((BackgroundWorker)sender).CancellationPending)
                    {
                        e.Cancel = true;
                        //set this code at the end of file processing
                        return;
                    }
                }
            }