C#中的BackgroundWorker控件
C#中的BackgroundWorker控件
Keywords: C# .NET BackgroundWorker
Source: 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#中的BackgroundWorker控件的更多相关文章
- C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用)
C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用) 简单代码,记录一下.一个BackgroundWorker控件 backgroundWorkerRefr ...
- BackgroundWorker控件
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- 封装BackgroundWorker控件(提供源代码下载,F5即可见效果)
Demo源码 背景 经常做些小程序或者小DEMO的时候会用到异步,多线程来执行一些比较耗时的工作同时将进度及时进行反馈.我通常会使用位于[ System.ComponentModel]命名空间下的Ba ...
- 在DevExpress程序中使用SplashScreenManager控件实现启动闪屏和等待信息窗口
在我很早的WInform随笔<WinForm界面开发之"SplashScreen控件">有介绍如何使用闪屏的处理操作,不过那种是普通WInform和DevExpress ...
- 在WPF中使用WinForm控件方法
1. 首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2. 在要使用WinForm控 ...
- wpf telerik中的book控件
下载 telerik中的书本控件,仅供学习使用.
- [原创]在Framelayout中放置button控件出现的覆盖问题
android Framelayout(帧布局)是很常用的布局,主要用来处理需要多个view叠加显示的情况. 然而在使用中,我发现Framelayout中的Button控件,会挡住所有其他控件,而不论 ...
- (转)客户端触发Asp.net中服务端控件事件
第一章. Asp.net中服务端控件事件是如何触发的 Asp.net 中在客户端触发服务端事件分为两种情况: 一. WebControls中的Button 和HtmlControls中的Type为su ...
- 在web中使用windows控件,实现摄像头功能
最近做的一个Web版的视频会议项目,需要在网页中播放来自远程摄像头采集的实时视频,我们已经有了播放远程实时视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,A ...
随机推荐
- windows server2003/2008中权限账户
在windows server 2003与windows server 2008 R2中,查看文件夹权限时,尤其是用cacls命令查看时,经常会见nt authority system这样的用户信息. ...
- android学习三---创建第一个程序
1.创建一个Helloworld程序 1.1 new-android application 点击file-new-android application出现如下界面 填上应用名,项目名,包名,选择所 ...
- linux list.h 移植
Linux内核中List链表的实现,对于想进阶的程序员来说,无疑是一个很好的学习机会.内核实现了一个功能十分强大的链表,而且是开源的,用在其他需要的地方岂不是很省事. 一.看List实现前,先补充ty ...
- re模块(Python中的正则表达式)
re模块 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...
- MVC4 中使用 Area 和 注意的地方
在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰. 步骤如下: 项目 –> 添加 -> 区域 (Area) 输入 Admin 添加成功后 Area包含:创建一个空 ...
- nodejs socket server 强制关闭客户端连接
nodejs socket server 强制关闭客户端连接: client.destroy()
- windows 2008 负载均衡(NLB) 问题汇总
1. 主机不可访问 修改host文件. 将主机名与IP做相应的映射. 它们应该是使用主机名来访问对应的服务器. host文件路径: C:\Windows\System32\drivers\etc 19 ...
- PDO:数据访问抽象层
<?php //PDO:数据访问抽象层 //带有事务功能: //dsn:数据源 $dsn="mysql:host=localhost;dbname=aaas"; //造pdo ...
- ruby rails 安裝
安装之前先更换Ubuntu的源 https://www.cnblogs.com/znsongshu/p/9452067.html http://gems.ruby-china.org/ 一/安 ...
- iOS KVC 和 KVO 的学习
KVC (NSKey Value Coding) :键值编码 KVO (Key Value Observing) :键值监听 前言:我曾经用过 监听 一个音频何时结束 监听视频播放 状态等 用了这种 ...


