C#中的BackgroundWorker控件
2016-06-29 11:46
375 查看
C#中的BackgroundWorker控件
Keywords: C# .NET BackgroundWorkerSource: http://txw1958.cnblogs.com/
BackgroundWorker是.NET Framework 里用来执行多线程任务的控件,它允许开发人员在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。
若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。 可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。 如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
语法
public class BackgroundWorker : Component
构造函数
名称 | 说明 | |
---|---|---|
BackgroundWorker | 初始化 BackgroundWorker 类的新实例。 |
属性
名称 | 说明 | |
---|---|---|
CancellationPending | 获取一个值,指示应用程序是否已请求取消后台操作。 | |
CanRaiseEvents | 获取一个指示组件是否可以引发事件的值。 (继承自 Component。) | |
Container | 获取 IContainer,它包含 Component。 (继承自 Component。) | |
DesignMode | 获取一个值,用以指示 Component 当前是否处于设计模式。 (继承自 Component。) | |
Events | 获取附加到此 Component 的事件处理程序的列表。 (继承自 Component。) | |
IsBusy | 获取一个值,指示 BackgroundWorker 是否正在运行异步操作。 | |
Site | 获取或设置 Component 的 ISite。 (继承自 Component。) | |
WorkerReportsProgress | 获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。 | |
WorkerSupportsCancellation | 获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。 |
方法
事件
名称 | 说明 | |
---|---|---|
Disposed | 当通过调用 Dispose 方法释放组件时发生。 (继承自 Component。) | |
DoWork | 调用 RunWorkerAsync 时发生。 | |
ProgressChanged | 调用 ReportProgress 时发生。 | |
RunWorkerCompleted | 当后台操作已完成、被取消或引发异常时发生。 |
示例
本代码运行环境:Windows XP, Visual Studio 2010, .NET Framework 4, C#下面的代码示例演示 BackgroundWorker 类异步执行耗时的基本知识。 下图显示输出的示例。
要尝试该代码,可创建 Windows 窗体应用程序。 添加一个名为 resultLabel 的 Label 控件并添加两个名为 startAsyncButton 和 cancelAsyncButton 的 Button 控件。 创建这两个按钮的 Click 事件处理程序。 从工具箱中的“组件”选项卡中,添加命名为 backgroundWorker1 的 BackgroundWorker 组件。 创建 DoWork、 ProgressChanged 和 BackgroundWorker 的 RunWorkerCompleted 事件处理程序。
在窗体的代码中,用下列代码替换现有代码。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication5 { public partial class Form1 : Form { public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; } private void startAsyncButton_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy != true) { // 启动异步操作 backgroundWorker1.RunWorkerAsync(); } this.startAsyncButton.Enabled = false; } private void cancelAsyncButton_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation == true) { // 取消异步操作 backgroundWorker1.CancelAsync(); } this.startAsyncButton.Enabled = true; } //主任务的实现 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; i <= 10; i++) { if (worker.CancellationPending == true) { e.Cancel = true; break; } else { // 执行计时操作并且报告进度 System.Threading.Thread.Sleep(500); worker.ReportProgress(i * 10); } } } //更新进度 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { resultLabel.Text = (e.ProgressPercentage.ToString() + "%"); } //处理后台操作结果 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled == true) { resultLabel.Text = "Canceled!"; } else if (e.Error != null) { resultLabel.Text = "Error: " + e.Error.Message; } else { resultLabel.Text = "Done!"; } } } }
相关文章推荐
- C#中的线程(四)高级话题
- C#中的线程(三)多线程
- C#中的线程(一)入门
- C#中的线程(二)线程同步
- C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)
- C#使用foreach循环遍历数组完整实例
- c#传入域名返回对应的IP
- c#获取WebBrowser中的userAgent
- c#geckofx文件流下载
- C#遍历文件夹及其子目录的完整实现方法
- C# 验证数字
- C#简单遍历指定文件夹中所有文件的方法
- c#读取Excel的第一个Sheet表
- C#如何读取Excel文件
- C#基础一
- C#中一些常用的加密和哈希处理
- C#个人总结2——类和对象
- C#使用tesseract3.02识别验证码模拟登录
- c#中Invoke使用方法(线程间操作无效: 从不是创建控件的线程访问它。那么创建它的线程是哪个线程?)
- C#.NET 定时器类及使用方法