关于异步工作 BackgroundWorker的研究

来源:互联网 发布:网络共享文档 编辑:程序博客网 时间:2024/05/22 13:06

// 新建BackgroundWorker实例
backgroundCalculator = new BackgroundWorker();
// 设置可以通知工作进度
backgroundCalculator.WorkerReportsProgress = true;
// 支持取消工作
backgroundCalculator.WorkerSupportsCancellation = true;
// 定义工作线程的方法
backgroundCalculator.DoWork += new DoWorkEventHandler(backgroundCalculator_DoWork);
// 定义通知进度的方法
backgroundCalculator.ProgressChanged += new ProgressChangedEventHandler(backgroundCalculator_ProgressChanged);
// 定义工作完成的方法,一共有三种情况
// 1. 工作成功完成
// 2. 工作发生错误,失败
// 3. 用户
backgroundCalculator.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundCalculator_RunWorkerCompleted);

backgroundCalculator.RunWorkerAsync(参数); // 开始工作,参数传递到执行工作的方法:

void backgroundCalculator_DoWork(object sender, DoWorkEventArgs e)
        {
            int start = (int) e.Argument; // 获取参数
            e.Result = getNextPrimeAsync(start, (BackgroundWorker)sender, e); // 返回工作结果到e(示例是取得下一个素数)
        }

private int getNextPrimeAsync(int start, BackgroundWorker worker, DoWorkEventArgs e)
        {
            int percentComplete = 0;

            start++;
            while (!isPrime(start))
            {
                if (worker.CancellationPending) //如果被取消(使用backgroundCalculator.CancelAsync()取消)
                {
                    e.Cancel = true; // 设置该工作被取消
                    break;
                }
                else
                {
                    start++;
                    percentComplete++;
                    worker.ReportProgress(percentComplete % 100); //通知工作进度,传递参数到ProgressChangedEventArgs的ProgressPercentage量,并执行后面的变更进度方法
                }
            }
            return start;
        }

void backgroundCalculator_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    updateProgress(e.ProgressPercentage); //变更进度条的进度,使用上面传递的参数
}

void backgroundCalculator_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{ //方法执行完成,判断工作是否成功完成并执行相应方法
    if (e.Cancelled)
    {
        updateStatus("Cancelled.");
    }
    else if (e.Error != null)
    {
        reportError(e.Error);
    }
    else
    {
        reportPrime((int)e.Result);
    }
    calcProgress.Value = 0;
}

总结:

BackgroundWorker使用起来很简单,比起直接新建一个线程来执行工作要方便很多,主要是它各种EventArgs的参数传递使得多线程编程特别简单方便