C# (VS2019 Frameworks) 背景程序组件BackgroundWorker 的基本和使用
前言:
C#的应用软件中,经常要考虑到UI的相应和处理的程序(尤其占用时间很长的程序)之前的相应配合问题。
传统的思路,用线程的控制方法,加原子锁等方法,可是,再怎么搞都没有 windows C#自带的 BackgroundWorker 的方法更高效和稳定。
因为,`BackgroundWorker` 组件是实现异步编程的一种方式,它允许开发者在不阻塞主线程的情况下执行耗时操作,并通过事件与主线程安全地交互。
这个是windows内部,基于操作系统的工具。
在下面的参考代码里面,我们做了一个简单的带进度条的后台进程程序。
1 BackgroundWorker 的基本概念:
在C#中,
BackgroundWorker是一个组件,用于在后台线程中执行长时间运行的任务,而不会影响用户界面的响应性。BackgroundWorker允许你在后台线程中执行操作,同时可以安全地与主线程(通常是UI线程)通信。
1.2 属性和方法:
属性:
- `CancellationPending`: 一个只读属性,用于指示是否已经请求取消后台操作。如果用户请求取消操作,此属性将返回 `true`。
- `IsBusy`: 指示 `BackgroundWorker` 是否正在执行操作。
- `WorkerReportsProgress`: 用于标识,你是设置或获取 `BackgroundWorker` 报告进度更改。
- `WorkerSupportsCancellation`: 用于设置或获取 `BackgroundWorker` 是否支持取消操作。
事件:
- `DoWork`: 当 `RunWorkerAsync` 方法被调用时,此事件被触发。通常在此事件的处理程序中执行后台任务。
- `ProgressChanged`: 当 `ReportProgress` 方法被调用时,此事件被触发。可以在事件处理程序中更新用户界面以反映进度。
- `RunWorkerCompleted`: 当后台操作完成时,无论是正常完成、被取消还是发生错误,此事件都会被触发。
方法:(public)
- `CancelAsync`: 请求取消后台操作。如`WorkerSupportsCancellation` 属性设置为 `true`,此方法将触发 `CancellationPending` 属性变为 `true`。
- `ReportProgress`: 报告后台操作的进度。如 `WorkerReportsProgress` 属性设置为 `true`,可以使用此方法来更新进度指示器或执行其他与进度相关的操作。
- `RunWorkerAsync`: 启动后台操作
- `RunWorkerAsync (object argument)`: 带有参数的 `RunWorkerAsync` 方法。
受保护的虚方法:(只能在本背景类里面被调用,且可以重写和拓展)(protected)
- `OnDoWork(DoWorkEventArgs e)`: 当 `DoWork` 事件被触发时,此方法被调用。通常在此方法中实现后台任务的逻辑。
- `OnProgressChanged(ProgressChangedEventArgs e)`: 当 `ProgressChanged` 事件被触发时,此方法被调用。可以在此处更新进度信息。
- `OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)`: 当 `RunWorkerCompleted` 事件被触发时,此方法被调用。可以在此处处理后台操作完成后的清理工作或结果。
BackgroundWorker 具有的属性和方法如上,大多数是字面意思,我们读的懂,就可以用,我后面列举两个例子:
2 构建 BackgroundWorker 的方法:
2.1 加载
这行代码的目的是将事件的 sender 参数转换为 BackgroundWorker 类型,以便使用 BackgroundWorker 类的成员。如果转换成功,worker 将是一个指向原始 BackgroundWorker 实例的引用
string filePath = e.Argument as string; // 从参数中获取文件路径
4.3 后***成
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { MessageBox.Show("操作已取消。"); } else if (e.Error != null) { MessageBox.Show("发生错误: " + e.Error.Message); } else { // 使用 DoWork 事件处理器的结果 MessageBox.Show("操作结果: " + e.Result); } } 5 运行结果展示:
我在Form的底部加了一个进度条,然后,运行后台模拟进度后,显示如下: