有时候,你可能需要另建一个线程,在后台持续运行以完成某项任务,并不时地与主线程通信。Backgroundworker就是为此而生的。
一.属性
1.BackgroundWorker.CancellationPending 属性
获取一个值,指示应用程序是否已请求取消后台操作。
public bool CancellationPending { get; }
如果应用程序已请求取消后台操作,则为 true
;否则为 false
。 默认值为 false
。
2.BackgroundWorker.IsBusy 属性
获取一个值,指示 BackgroundWorker 是否正在运行异步操作。
public bool IsBusy { get; }
如果 BackgroundWorker 正在运行异步操作,则为 true
;否则为 false
。
3.BackgroundWorker.WorkerReportsProgress 属性
获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。
public bool WorkerReportsProgress { get; set; }
如果 BackgroundWorker 支持进度更新,则为 true
;否则为 false
。 默认值为 false
。
4.BackgroundWorker.WorkerSupportsCancellation 属性
取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。
public bool WorkerSupportsCancellation { get; set; }
如果 BackgroundWorker 支持取消,则为 true
;否则为 false
。 默认值为 false
。
二.方法
1.BackgroundWorker.CancelAsync 方法
请求取消挂起的后台操作。
public void CancelAsync ();
2.BackgroundWorker.OnDoWork(DoWorkEventArgs) 方法
引发 DoWork 事件。
protected virtual void OnDoWork (System.ComponentModel.DoWorkEventArgs e);
3.BackgroundWorker.OnProgressChanged(ProgressChangedEventArgs) 方法
引发 ProgressChanged 事件。
protected virtual void OnProgressChanged (System.ComponentModel.ProgressChangedEventArgs e);
4.BackgroundWorker.OnRunWorkerCompleted(RunWorkerCompletedEventArgs) 方法
引发 RunWorkerCompleted 事件。
protected virtual void OnRunWorkerCompleted (System.ComponentModel.RunWorkerCompletedEventArgs e);
5.BackgroundWorker.ReportProgress 方法
引发 ProgressChanged 事件。
public void ReportProgress (int percentProgress);
6.BackgroundWorker.RunWorkerAsync 方法
开始执行后台操作。
public void RunWorkerAsync ();
三.事件
1.BackgroundWorker.DoWork 事件
调用 RunWorkerAsync() 时发生。
public event System.ComponentModel.DoWorkEventHandler? DoWork;
示例:
下面的代码示例演示如何使用 DoWork 事件启动异步操作。 此代码示例是为 BackgroundWorker 类提供的一个更大示例的一部分。
// 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);
}
2.BackgroundWorker.ProgressChanged 事件
调用 ReportProgress(Int32) 时发生。
public event System.ComponentModel.ProgressChangedEventHandler? ProgressChanged;
示例:
下面的代码示例演示如何使用 ProgressChanged 事件向用户报告异步操作的进度。 此代码示例是为 BackgroundWorker 类提供的一个更大示例的一部分。
// This event handler updates the progress bar.
private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
3.BackgroundWorker.RunWorkerCompleted 事件
当后台操作已完成、被取消或引发异常时发生。
public event System.ComponentModel.RunWorkerCompletedEventHandler? RunWorkerCompleted;
示例:
下面的代码示例演示如何使用 RunWorkerCompleted 事件来处理异步操作的结果。 此代码示例是为 BackgroundWorker 类提供的一个更大示例的一部分。
// 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;
}