C# BackgroundWorker的例子
以下是一个使用 BackgroundWorker 组件在 C# 中实现后台执行任务,同时在主线程更新 UI(例如显示任务进度等)的示例。在这个示例中,模拟一个耗时的任务(比如计算从 1 累加到一个较大的数),并实时展示进度。
1. 创建 Windows Forms 应用程序项目(以 Windows Forms 为例来展示 UI 交互,如果是控制台应用等也可类似调整思路)
在 Visual Studio 中创建一个新的 Windows Forms 应用程序项目,默认会生成一个包含 Form1.cs 等文件的项目结构。
2. 设计界面(简单添加几个控件用于展示和交互)
在 Form1 的设计视图中添加以下控件:
Button:用于触发后台任务开始,将其 Text 属性设置为 "开始计算"。
ProgressBar:用来展示后台任务的进度,将其 Minimum 属性设为 0,Maximum 属性设为 100(代表进度的 0% - 100% 范围)。
Label:用于显示一些提示信息,比如任务完成后的结果等。
3. 编写代码实现后台任务逻辑及 UI 更新
以下是 Form1.cs 文件中的完整代码示例:
using System; using System.ComponentModel; using System.Windows.Forms; namespace BackgroundWorkerExample { public partial class Form1 : Form { private BackgroundWorker backgroundWorker; public Form1() { InitializeComponent(); // 初始化BackgroundWorker实例 backgroundWorker = new BackgroundWorker(); // 设置支持报告进度 backgroundWorker.WorkerReportsProgress = true; // 设置支持取消操作(这里示例暂未详细体现取消逻辑,可自行扩展) backgroundWorker.WorkerSupportsCancellation = true; // 绑定DoWork事件处理方法,该方法中执行实际的后台任务 backgroundWorker.DoWork += BackgroundWorker_DoWork; // 绑定ProgressChanged事件处理方法,用于更新UI上的进度条等展示进度的控件 backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged; // 绑定RunWorkerCompleted事件处理方法,用于在任务完成后做一些收尾工作,比如显示最终结果等 backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted; } private void button1_Click(object sender, EventArgs e) { if (!backgroundWorker.IsBusy) { // 重置进度条 progressBar1.Value = 0; // 启动后台任务 backgroundWorker.RunWorkerAsync(100000); // 这里传入一个较大的数,模拟耗时任务(计算1到这个数的累加) } } private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { // 获取传入的参数(这里就是要累加到的那个数) int n = (int)e.Argument; intsum = 0; for (int i = 1; i <= n; i++) { sum ++ i; // 计算进度百分比并报告进度,这里简单按已累加的数与总数的比例来算进度 int progressPercentage = (int)((double)i / n * 100); backgroundWorker.ReportProgress(progressPercentage); } e.Result = sum; // 将计算结果存储到DoWorkEventArgs的Result属性中,方便后续获取 } private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { // 更新进度条的进度值 progressBar1.Value = e.ProgressPercentage; // 也可以在这里更新其他UI控件来展示进度相关信息,比如在Label中显示当前进度百分比 label1.Text = $"当前进度: {e.ProgressPercentage}%"; } private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error == null) { // 如果没有错误,显示最终的计算结果 label1.Text = $"计算完成,结果为: {e.Result}"; } else { // 如果出现错误,显示错误信息 label1.Text = $"出现错误: {e.Error.Message}"; } } } }
在上述代码中:
初始化 BackgroundWorker 及绑定事件处理方法:
在 Form1 的构造函数中,创建 BackgroundWorker 实例,并设置 WorkerReportsProgress 为 true(表示支持报告进度),WorkerSupportsCancellation 为 true(支持取消操作,示例中暂未详细体现取消逻辑,可自行扩展)。然后分别绑定 DoWork(执行后台任务)、ProgressChanged(更新 UI 进度展示)、RunWorkerCompleted(任务完成后的收尾工作)这三个关键事件的处理方法。
触发后台任务开始:
当点击界面上的 “开始计算” 按钮时,先判断 BackgroundWorker 是否正在忙碌(IsBusy 属性判断),如果不忙,就重置进度条,然后通过 RunWorkerAsync 方法启动后台任务,并传入一个参数(这里模拟传入一个较大的数用于计算从 1 累加到这个数的耗时任务)。
执行后台任务(DoWork 事件处理):
在 BackgroundWorker_DoWork 方法中,获取传入的参数,然后通过循环进行累加计算。在每次循环中,计算当前的进度百分比,并通过 ReportProgress 方法向主线程报告进度,同时将最终的计算结果存储到 DoWorkEventArgs 的 Result 属性中,方便后续获取。
更新 UI 展示进度(ProgressChanged 事件处理):
在 BackgroundWorker_ProgressChanged 方法中,根据接收到的进度百分比更新进度条的 Value 属性,还可以在这里更新其他 UI 控件(如示例中更新 Label 的文本显示当前进度百分比)来展示进度相关信息。
任务完成后的处理(RunWorkerCompleted 事件处理):
在 BackgroundWorker_RunWorkerCompleted 方法中,判断是否有错误发生,如果没有错误,就从 e.Result 中获取计算结果并在 Label 中显示最终的计算结果;如果出现错误,则显示相应的错误信息。
这样就利用 BackgroundWorker 实现了一个简单的后台执行任务并实时更新 UI 展示进度的示例,你可以根据实际需求对后台任务的具体逻辑以及 UI 展示等进行调整和扩展。
请注意,如果是在控制台应用程序等非 Windows Forms 环境中使用 BackgroundWorker,部分与 UI 更新相关的代码(如操作进度条、标签等控件)需要进行相应调整或者去除,重点关注后台任务执行及进度报告等核心逻辑即可。
转载请注明出处。