http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(VS.80).aspx
BackgroundWorker类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。
若要在后台执行耗时的操作,请创建一个BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
若要设置后台操作,请为DoWork事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作,请调用RunWorkerAsync。若要收到进度更新通知,请对ProgressChanged事件进行处理。若要在操作完成时收到通知,请对RunWorkerCompleted事件进行处理。
下面代码演示如何用BackgroundWorker计算斐波那契数列并表示当前进度
/////////////////////////////Form1.cs///////////////////////////////
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
private int numberToCompute = 0;
private int highestPercentageReached = 0;
public Form1()
{
InitializeComponent();
InitializeBackgoundWorker();
}
// Set up the BackgroundWorker object by
// attaching event handlers.
private void InitializeBackgoundWorker()
{
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
}
private void startAsyncButton_Click(System.Object sender, System.EventArgs e)
{
// Reset the text in the result label.
resultLabel.Text = String.Empty;
// Disable the UpDown control until
// the asynchronous operation is done.
this.numericUpDown1.Enabled = false;
// Disable the Start button until
// the asynchronous operation is done.
this.startAsyncButton.Enabled = false;
// Enable the Cancel button while
// the asynchronous operation runs.
this.cancelAsyncButton.Enabled = true;
// Get the value from the UpDown control.
numberToCompute = (int)numericUpDown1.Value;
// Reset the variable for percentage tracking.
highestPercentageReached = 0;
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync(numberToCompute);
}
private void cancelAsyncButton_Click(System.Object sender, System.EventArgs e)
{
// Cancel the asynchronous operation.
this.backgroundWorker1.CancelAsync();
// Disable the Cancel button.
cancelAsyncButton.Enabled = false;
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = sender as BackgroundWorker;
// Assign the result of the computation
// to the Result property of the DoWorkEventArgs
// object. This is will be available to the
// RunWorkerCompleted eventhandler.
e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
// This event handler deals with the results of the
// background operation.
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// First, handle the case where an exception was thrown.
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
// Next, handle the case where the user canceled
// the operation.
// Note that due to a race condition in
// the DoWork event handler, the Cancelled
// flag may not have been set, even though
// CancelAsync was called.
resultLabel.Text = "Canceled";
}
else
{
// Finally, handle the case where the operation
// succeeded.
resultLabel.Text = e.Result.ToString();
}
// Enable the UpDown control.
this.numericUpDown1.Enabled = true;
// Enable the Start button.
startAsyncButton.Enabled = true;
// Disable the Cancel button.
cancelAsyncButton.Enabled = false;
}
// This event handler updates the progress bar.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
// This is the method that does the actual work. For this
// example, it computes a Fibonacci number and
// reports progress as it does its work.
long ComputeFibonacci(int n, BackgroundWorker worker, DoWorkEventArgs e)
{
// The parameter n must be >= 0 and <= 91.
// Fib(n), with n > 91, overflows a long.
if ((n < 0) || (n > 91))
{
throw new ArgumentException("value must be >= 0 and <= 91", "n");
}
long result = 0;
// Abort the operation if the user has canceled.
// Note that a call to CancelAsync may have set
// CancellationPending to true just after the
// last invocation of this method exits, so this
// code will not have the opportunity to set the
// DoWorkEventArgs.Cancel flag to true. This means
// that RunWorkerCompletedEventArgs.Cancelled will
// not be set to true in your RunWorkerCompleted
// event handler. This is a race condition.
if (worker.CancellationPending)
{
e.Cancel = true;
}
else
{
if (n < 2)
{
result = 1;
}
else
{
result = ComputeFibonacci(n - 1, worker, e) + ComputeFibonacci(n - 2, worker, e);
}
// Report progress as a percentage of the total task.
int percentComplete = (int)((float)n / (float)numberToCompute * 100);
if (percentComplete > highestPercentageReached)
{
highestPercentageReached = percentComplete;
worker.ReportProgress(percentComplete);
}
}
return result;
}
}
}
相关推荐
- 使用`System.IO`命名空间:在C#中,`System.IO`提供了对文件和目录操作的基本类,如`Directory`、`DirectoryInfo`、`File`和`FileInfo`。它们用于列举目录、创建/删除文件和目录、读写文件等操作。 - 使用`...
下面将详细阐述这三个概念及其相互之间的关系,并通过一个实例代码进行说明。 1. 委托(Delegate): 委托在C#中相当于函数指针,它允许我们将方法作为参数传递给其他方法,或者存储方法以便稍后调用。委托类型是由...
本文将对C#工具箱中的各个组件进行详细的介绍,帮助新手快速了解和掌握C#工具箱的使用。 BackgroundWorker BackgroundWorker是一个特殊的组件,它可以在单独的线程上执行操作,避免了在主线程上执行耗时操作的影响...
C#提供了`Task`、`async/await`关键字以及`BackgroundWorker`类来支持多线程和异步编程。 9. **安全性**: 文件传输过程中需要考虑数据安全,可以使用SSL/TLS进行加密通信,防止数据被窃取。C#的`SslStream`类提供...
C#提供了System.Threading命名空间,包含了许多类和接口,如Thread、ThreadPool、Task等,用于创建和管理线程。 标签中的“.net c#_多线程 多线程_c#”再次强调了此项目的核心技术点,即C#语言与.NET环境下的多...
C#的`Task`或者`BackgroundWorker`类可以实现这一目标。 5. **数据结构与算法**:为了存储参与者名单或奖项信息,可能会用到数组、列表等数据结构。抽奖算法可能是从列表中随机选取,或者根据权重进行概率选择。 6...
10. **文档阅读**:明华公司的二次开发范例通常会附带详细的开发文档,包括接口说明、使用示例和故障排查指南。仔细阅读和理解这些文档,对于成功进行二次开发至关重要。 总的来说,"明华RD系列读卡器的C#版本二次...
1. **创建窗体**: 首先,我们需要创建一个新的窗体,这个窗体将包含旋转线条控件(如`System.Windows.Forms.Timer`控件配合自定义绘制或使用`Marquee Progress Bar`控件)和其他可能的UI元素,如文字说明。...
C#的Task和BackgroundWorker类可以用于实现异步编程。 10. **异常处理**: 为了确保程序的稳定性和健壮性,异常处理是必不可少的。开发者需要捕获并处理可能出现的错误,如网络连接问题、API调用失败等。 这个项目...
- Label控件:用于在界面上显示静态文本,比如程序标题或者说明。 - Button控件:用户可以通过点击来触发事件,例如启动和停止字符大小的变化。 - Timer控件:可能被用来实现字符大小随时间变化的效果。定时器每...
开发者需要根据SDK中的说明,学习如何调用相应的API函数,实现读取身份证信息的功能。 在C#中,我们可以使用P/Invoke技术(Platform Invoke)来调用非托管代码,即C/C++编写的DLL库。P/Invoke允许C#代码直接调用...
以下是一些关键知识点的详细说明: 1. **C#语言基础**:C#是微软推出的面向对象的编程语言,它具有类型安全、垃圾回收、内存管理等特性。在WinForm应用中,C#用于编写逻辑代码,处理用户交互和业务逻辑。 2. **...
以下是对这个主题的详细说明: 一、Windows Forms基础知识 Windows Forms是.NET Framework的一部分,提供了一组丰富的控件和组件,用于构建桌面应用程序的用户界面。在这个项目中,你可能会用到如TextBox、...
分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用的属性、方法、类和各种技术,...
4. **使用Task和async/await**:现代C#开发中,使用`Task`类和`async/await`关键字可以更简洁地管理异步操作。这种方法不仅提高了代码的可读性,还可以方便地处理异步操作的结果。 #### 结论 跨线程调用在C#中是一...
C#的`BackgroundWorker`组件或异步编程模型(如`async/await`)可以实现这一目标,确保程序响应性。 5. **文件过滤与搜索**:实现资源管理器时,通常会提供筛选和搜索功能。这需要理解正则表达式,以及如何使用`...
以下是对实现这一功能所需技术的详细说明: 1. **Windows Forms 应用程序**: - `WindowsFormsApplication1` 是一个标准的C# Windows Forms应用程序项目。Windows Forms是.NET Framework提供的用于构建桌面应用的...
以下是对这些知识点的详细说明: 1. **多线程基础**: 多线程是同时执行多个代码流的能力,这在C#中可以通过创建`System.Threading.Thread`对象来实现。创建新线程时,需要定义一个入口方法(即线程要执行的代码)...