private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(); //开始异步执行
        }
  private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync(); //button2取消异步执行
            MessageBox.Show(backgroundWorker1.CancellationPending.ToString());  //输出值为true
        }
  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {           
            Thread.Sleep(10000);
        }
  private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show(backgroundWorker1.CancellationPending.ToString());   //输出值为false         
        }
问题:
button2取消异步执行时,backgroundWorker的CancellationPending属性为true,可是在异步执行结束的事件RunWorkerCompleted中,CancellationPending属性为什么变成false了呢?

解决方案 »

  1.   

    當DoWork事件執行完畢進入RunWorkerCompleted事件後,BackgroundWorker的CancellationPending屬性值將會恢復為False
    ---------------------------------------
    http://www.dotblogs.com.tw/billchung/archive/2009/05/30/8597.aspx你应该设置DoWork方法中 DoWorkEventArgs  这个参数的 Cancel 值然后在RunWorkerCompleted方法中 判断 RunWorkerCompletedEventArgs.Cancelled
      

  2.   

    之前的那篇文章已经将关键点说出来了, VB 代码不理解的话,看这个http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx
      

  3.   

    简单的说就是在 DoWork 方法中,要检查CancellationPending 属性当CancellationPending 为true 时,设置 DoWorkEventArgs.Cancel 为 true并停止执行 DoWork 中的代码, 在 RunWorkerCompleted 方法中根据RunWorkerCompletedEventArgs.Cancelled 来检查是否停止
      

  4.   

    你说的利用Cacel属性判断,我还是知道,我就是想明白,CancellationPending这个属性的原理,
    其实,CancellationPending属性在btton2中为true,它在DoWork事件中也为true,而在RunWorkerCompleted事件中,就变成了false
    到底CancellationPending这个属性哪些时候为true,哪些时候为flase ?
    能看到它的原型吗?
      

  5.   

    不是 CancellationPending 的问题,它只是单纯的bool值变量的 get CancellationPending 值变化的原因是 AsyncOperationCompleted 方法原型如下:private void AsyncOperationCompleted(object arg)
    {
        this.isRunning = false;
        this.cancellationPending = false;
        this.OnRunWorkerCompleted((RunWorkerCompletedEventArgs) arg);
    }可以看到 是AsyncOperationCompleted触发的 RunWorkerCompleted 而在触发前,强制将 CancellationPending  设置为false 了
    [Browsable(false), SRDescription("BackgroundWorker_CancellationPending")]
    public bool CancellationPending
    {
        get
        {
            return this.cancellationPending;
        }
    }
    AsyncOperationCompleted 是在 DoWork 执行后,被执行它是个回调函数。
     
      

  6.   

    所以“當DoWork事件執行完畢進入RunWorkerCompleted事件後,BackgroundWorker的CancellationPending屬性值將會恢復為False"这个说法是正确的,不要在 RunWorkerCompleted 中依据CancellationPending 的值进行操作。
      

  7.   

    回调函数AsyncOperationCompleted,你在MSDN上哪里找到的,我没找到呢?MSDN咋不说这件事情呢?
      

  8.   

    我是反编译源码看的。 不过根据 AsyncOperationCompleted 我找到了一篇不错的文章,是 zhzuo 写的http://msdn.microsoft.com/zh-cn/dd441756.aspx