C# 多线程 BackgroundWorker

一、概述

        BackgroundWorker是一个基于事件的异步模式(EAP)的实现方式,用于管理工作线程。

        BackgroundWoker使用线程池,所以绝不允许调用Abort,否则会导致线程池异常。

二、创建及运行

        使用步骤:

  1. 创建BackgroundWorker对象,注册Dowork事件。
  2. 调用对象的RunWokerAsync方法执行异步操作,可以选用Object参数。
class Program
{
  static BackgroundWorker _bw = new BackgroundWorker();

  static void Main()
  {
    _bw.DoWork += bw_DoWork;
    _bw.RunWorkerAsync ("Message to worker");
    Console.ReadLine();
  }

  static void bw_DoWork (object sender, DoWorkEventArgs e)
  {
    // 这里在工作线程上执行
    Console.WriteLine (e.Argument);        // 打印 "Message to worker"
    // 执行耗时的任务...
  }
}

三、其他功能

(一)RunWokerCompleted 完成事件

        Backgroundworker在DoWork事件结束后会触发RunWorkerCompleted事件。

        RunWorkerCompleted事件不是必须的,但是可以查询在Dowork中发生的异常。

        RunWorkerCompleted事件中可以直接更新UI控件,不需要通过封送。

(二)ProgressChanged 进度事件

  1. 设置Backgroundworker对象的WorkerReportsProgress属性为True。
  2. 在Dowork事件中周期性的调用ReportProgress方法触发ProgressChanged事件,报告进度百分比的值。
  3. 注册ProgressChanged事件,查询ProgressPercentage属性。
  4. ProgressChanged事件中可以直接更新UI控件,一般用该事件更新进度条控件。

(三) 取消功能

  1. 设置WorkerSupportsCancellation属性为True。
  2. 在Dowork事件中周期性的检查CancellationPending属性,如果为true,就设置事件参数的Cancel属性为true,然后返回。(也可以直接设置Cancel来退出)
  3. 调用CanelAsync来请求取消。

代码:

using System;
using System.Threading;
using System.ComponentModel;

class Program
{
  static BackgroundWorker _bw;

  static void Main()
  {
    _bw = new BackgroundWorker
    {
      WorkerReportsProgress = true,
      WorkerSupportsCancellation = true
    };
    _bw.DoWork += bw_DoWork;
    _bw.ProgressChanged += bw_ProgressChanged;
    _bw.RunWorkerCompleted += bw_RunWorkerCompleted;

    _bw.RunWorkerAsync ("Hello to worker");

    Console.WriteLine ("Press Enter in the next 5 seconds to cancel");
    Console.ReadLine();
    if (_bw.IsBusy) _bw.CancelAsync();
    Console.ReadLine();
  }

  static void bw_DoWork (object sender, DoWorkEventArgs e)
  {
    for (int i = 0; i <= 100; i += 20)
    {
      if (_bw.CancellationPending) { e.Cancel = true; return; }
      _bw.ReportProgress (i);
      Thread.Sleep (1000);      // 仅仅为了演示...
    }                           // 真实环境中不要在线程池线程上使用 Sleep !

    e.Result = 123;    // 这会传递给 RunWorkerCompleted
  }

  static void bw_RunWorkerCompleted (object sender,
                                     RunWorkerCompletedEventArgs e)
  {
    if (e.Cancelled)
      Console.WriteLine ("You canceled!");
    else if (e.Error != null)
      Console.WriteLine ("Worker exception: " + e.Error.ToString());
    else
      Console.WriteLine ("Complete: " + e.Result);      // 来自 DoWork
  }

  static void bw_ProgressChanged (object sender,
                                  ProgressChangedEventArgs e)
  {
    Console.WriteLine ("Reached " + e.ProgressPercentage + "%");
  }
}

输出结果:

Press Enter in the next 5 seconds to cancel
Reached 0%
Reached 20%
Reached 40%
Reached 60%
Reached 80%
Reached 100%
Complete: 123

Press Enter in the next 5 seconds to cancel
Reached 0%
Reached 20%
Reached 40%

You canceled!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用BackgroundWorker开启多线程时,需要先创建一个BackgroundWorker对象,然后设置DoWork事件处理程序。接着在主线程中调用BackgroundWorker的RunWorkerAsync方法,该方法将启动一个新线程并执行DoWork事件处理程序。可以通过设置BackgroundWorkerWorkerReportsProgress和WorkerSupportsCancellation属性,使其支持进度报告和取消操作。 以下是一个简单的示例代码,演示如何使用BackgroundWorker开启多线程: ```c# private BackgroundWorker worker; private void buttonStart_Click(object sender, EventArgs e) { // 创建BackgroundWorker对象 worker = new BackgroundWorker(); // 设置DoWork事件处理程序 worker.DoWork += new DoWorkEventHandler(worker_DoWork); // 设置支持进度报告和取消操作 worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; // 启动新线程 worker.RunWorkerAsync(); } private void worker_DoWork(object sender, DoWorkEventArgs e) { // 执行耗时操作 for (int i = 1; i <= 100; i++) { // 发送进度报告 worker.ReportProgress(i); // 检查是否取消操作 if (worker.CancellationPending) { e.Cancel = true; return; } // 模拟耗时操作 Thread.Sleep(50); } } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { // 更新进度条 progressBar1.Value = e.ProgressPercentage; } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // 检查是否取消操作 if (e.Cancelled) { MessageBox.Show("操作已取消"); } else if (e.Error != null) { MessageBox.Show("发生错误:" + e.Error.Message); } else { MessageBox.Show("操作已完成"); } } ``` 在上述代码中,buttonStart_Click事件处理程序中创建了一个BackgroundWorker对象,并设置DoWork事件处理程序、支持进度报告和取消操作。然后调用RunWorkerAsync方法启动新线程。在worker_DoWork事件处理程序中执行耗时操作,并发送进度报告。在worker_ProgressChanged事件处理程序中更新进度条。在worker_RunWorkerCompleted事件处理程序中检查是否取消操作或发生错误,并显示相应的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值