3、注意:

  1)确保 ***EventArgs类特定于***方法。即当使用 ***EventArgs类时,切勿要求开发人员强制转换类型值。

  2)确保始终引发方法名称Completed 事件。成功完成、异常或者取消时应引发此事件。任何情况下,应用程序都不应遇到这样的情况:应用程序保持空闲状态,而操作却一直不能完成。

  3)确保可以捕获异步操作中发生的任何异常并将捕获的异常指派给 Error 属性。

  4)确保 ***CompletedEventArgs 类将其成员公开为只读属性而不是字段,因为字段会阻止数据绑定。eg:public MyReturnType Result { get; }

  5)在构建 ***CompletedEventArgs 类属性时,通过this.RaiseExceptionIfNecessary()方法确保属性值被正确使用。Eg:
private bool isPrimeValue; 
public bool IsPrime 

    get 
    { 
        RaiseExceptionIfNecessary(); 
        return isPrimeValue; 
    } 
}

  所以,在***Completed事件处理程序中,应当总是先检查 ***CompletedEventArgs.Error 和 ***CompletedEventArgs.Cancelled 属性,然后再访问RunWorkerCompletedEventArgs.Result属性。

  BackgroundWorker组件

  System.ComponentModel命名空间的BackgroundWorker组件为我们提供了一个简单的多线程应用解决方案,它允许你在单独的线程上运行耗时操作而不会导致用户界面的阻塞。但是,要注意它同一时刻只能运行一个异步耗时操作(使用IsBusy属性判定),并且不能跨AppDomain边界进行封送处理(不能在多个AppDomain中执行多线程操作)。

  1、BackgroundWorker组件
public class BackgroundWorker : Component 

    public BackgroundWorker(); 
  
    // 获取一个值,指示应用程序是否已请求取消后台操作。 
    public bool CancellationPending { get; } 
    // 获取一个值,指示BackgroundWorker是否正在运行异步操作。 
    public bool IsBusy { get; } 
    // 获取或设置一个值,该值指示BackgroundWorker能否报告进度更新。 
    public bool WorkerReportsProgress { get; set; } 
    // 获取或设置一个值,该值指示BackgroundWorker是否支持异步取消。 
    public bool WorkerSupportsCancellation { get; set; } 
  
    // 调用RunWorkerAsync() 时发生。 
    public event DoWorkEventHandlerDoWork; 
    // 调用ReportProgress(System.Int32) 时发生。 
    public event ProgressChangedEventHandlerProgressChanged; 
    // 当后台操作已完成、被取消或引发异常时发生。 
    public event RunWorkerCompletedEventHandlerRunWorkerCompleted; 
  
    // 请求取消挂起的后台操作。 
    public void CancelAsync(); 
    // 引发ProgressChanged事件。percentProgress:范围从 0% 到  
    public void ReportProgress(int percentProgress); 
    // userState:传递到RunWorkerAsync(System.Object) 的状态对象。 
    public void ReportProgress(int percentProgress, object userState); 
    // 开始执行后台操作。 
    public void RunWorkerAsync(); 
    // 开始执行后台操作。argument:传递给DoWork事件的DoWorkEventArgs参数。 
    public void RunWorkerAsync(object argument); 
}

  2、相应的EventArgs类
///1)   System.EventArgs基类 
    // System.EventArgs是包含事件数据的类的基类。 
    public class EventArgs 
    { 
        // 表示没有事件数据的事件。 
        public static readonly EventArgs Empty; 
        public EventArgs(); 
    } 
  
///2)   DoWorkEventArgs类 
    // 为可取消的事件提供数据。 
    public class CancelEventArgs : EventArgs 
    { 
        public CancelEventArgs(); 
        public CancelEventArgs(bool cancel); 
        // 获取或设置指示是否应取消事件的值。 
        public bool Cancel { get; set; } 
    } 
    // 为DoWork事件处理程序提供数据。 
    public class DoWorkEventArgs : CancelEventArgs 
    { 
        public DoWorkEventArgs(object argument); 
  
        // 获取表示异步操作参数的值。 
        public object Argument { get; } 
        // 获取或设置表示异步操作结果的值。 
        public object Result { get; set; } 
    } 
  
///3)   ProgressChangedEventArgs类 
    // 为ProgressChanged事件提供数据。 
    public class ProgressChangedEventArgs : EventArgs 
    { 
        public ProgressChangedEventArgs(int progressPercentage, object userState); 
  
        // 获取异步任务的进度百分比。 
        public int ProgressPercentage { get; } 
        // 获取的用户状态。 
        public object UserState { get; } 
    } 
  
///4)   RunWorkerCompletedEventArgs类 
    // 为MethodNameCompleted事件提供数据。 
    public class AsyncCompletedEventArgs : EventArgs 
    { 
        public AsyncCompletedEventArgs(); 
        public AsyncCompletedEventArgs(Exception error, bool cancelled, object userState); 
  
        // 获取一个值,该值指示异步操作是否已被取消。 
        public bool Cancelled { get; } 
        // 获取一个值,该值指示异步操作期间发生的错误。 
        public Exception Error { get; } 
        // 获取异步任务的标识符。 
        public object UserState { get; } 
  
        // 访问 AsyncCompletedEventArgs 及其派生类的属性前调用此方法 
        protected void RaiseExceptionIfNecessary() 
        { 
            if (this.Error != null) 
            { 
                throw new TargetInvocationException(……); 
            } 
            if (this.Cancelled) 
            { 
                throw new InvalidOperationException(……); 
            } 
        } 
    } 
    public class RunWorkerCompletedEventArgs : AsyncCompletedEventArgs 
    { 
        public RunWorkerCompletedEventArgs(object result, Exception error, bool cancelled); 
  
        // 获取表示异步操作结果的值。 
        public object Result { get; } 
        // 获取表示用户状态的值。 
        public object UserState { get; } 
    }