关于异步工作 BackgroundWorker的研究

// 新建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的参数传递使得多线程编程特别简单方便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值