BackgroundWorker.DoWork 事件

定义

调用 RunWorkerAsync() 时发生。

public event System.ComponentModel.DoWorkEventHandler DoWork;
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);
}

注解

调用 方法时会引发此 RunWorkerAsync 事件。 这是开始执行可能耗时的工作的操作的位置。

事件处理程序中的DoWork代码应定期检查CancellationPending属性值,如果true为 ,则中止操作。 发生这种情况时,可以将 的 标志设置为 Canceltrue,事件处理程序Cancelled中的 RunWorkerCompleted 标志System.ComponentModel.RunWorkerCompletedEventArgs将设置为 trueSystem.ComponentModel.DoWorkEventArgs

注意

请注意,事件处理程序中的 DoWork 代码可能会在发出取消请求时完成其工作,并且轮询循环可能会错过 CancellationPending 设置为 true。 在这种情况下,即使发出了取消请求,Cancelled事件处理程序中的 RunWorkerCompleted 标志System.ComponentModel.RunWorkerCompletedEventArgs也不会设置为 true。 这种情况称为 争用条件 ,是多线程编程中常见的问题。 有关多线程设计问题的详细信息,请参阅 托管线程处理最佳做法

如果操作生成结果,可以将结果分配给 DoWorkEventArgs.Result 属性。 此属性将可用于 属性中的RunWorkerCompletedRunWorkerCompletedEventArgs.Result事件处理程序。

如果 操作引发代码未处理的异常, BackgroundWorker 将捕获该异常并将其 RunWorkerCompleted 传递到事件处理程序中,在该事件处理程序中,它作为 ErrorSystem.ComponentModel.RunWorkerCompletedEventArgs属性公开。 如果在 Visual Studio 调试器下运行,则调试器将在事件处理程序中 DoWork 引发未经处理的异常的点处中断。 如果有多个 BackgroundWorker,则不应直接引用其中的任何一个,因为这样会将事件处理程序耦合 DoWork 到 的特定实例 BackgroundWorker。 相反,应通过在事件处理程序中DoWork强制转换 sender 参数来访问 BackgroundWorker

必须注意不要在事件处理程序中 DoWork 操作任何用户界面对象。 而应该通过 BackgroundWorker 事件与用户界面进行通信。

有关如何处理事件的详细信息,请参阅 处理和引发事件

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

另请参阅