比如
        void workerThread_DoWork(object sender, DoWorkEventArgs e)
        {
            Thread.Sleep(1000000);
        }
能随时直接中止掉么?还是一定要Sleep完才能操作?

解决方案 »

  1.   

    参见MSDN:BackgroundWorker.CancelAsync 方法 
    请求取消挂起的后台操作。 
    CancelAsync 提交终止挂起的后台操作的请求,并将 CancellationPending 属性设置为 true。调用 CancelAsync 时,辅助方法可以停止其执行并退出。辅助代码应定期检查 CancellationPending 属性,查看是否已将该属性设置为 true。请注意,DoWork 事件处理程序中的代码有可能在发出取消请求时完成其工作,轮询循环可能会错过设置为 true 的 CancellationPending。在这种情况下,即使发出了取消请求,RunWorkerCompleted 事件处理程序中 System.ComponentModel.RunWorkerCompletedEventArgs 的 Cancelled 标志也不会设置为 true。这种情况被称作争用状态,它是多线程编程中的常见问题。有关多线程设计问题的更多信息,请参见托管线程处理的最佳做法。下面的代码示例演示如何使用 CancelAsync 方法取消异步(“后台”)操作。private void cancelAsyncButton_Click(System.Object sender, 
        System.EventArgs e)
    {   
        // Cancel the asynchronous operation.
        this.backgroundWorker1.CancelAsync();    // Disable the Cancel button.
        cancelAsyncButton.Enabled = false;
    }
      

  2.   

    好像没有这么简单。
    .CancelAsync()只是设置了CancellationPending的值。并没有停止线程。
      

  3.   

    private void button1_Click(object sender, EventArgs e)
            {
                a = new BackgroundWorker();
                a.DoWork += new DoWorkEventHandler(a_DoWork);
                a.RunWorkerCompleted += new RunWorkerCompletedEventHandler(a_RunWorkerCompleted);
                a.WorkerSupportsCancellation = true;            a.RunWorkerAsync();
            }        void a_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                label1.BackColor = Color.Black;
            }        void a_DoWork(object sender, DoWorkEventArgs e)
            {
                System.Threading.Thread.Sleep(5000);        }        private void button2_Click(object sender, EventArgs e)
            {
                a.CancelAsync();
            }
    button2点完5秒钟后label1仍然会变成黑色。请问一定要在a_DoWork中加循环来判断CancellationPending么?可那样的话,label1变色的时间就不准了。
      

  4.   

    看来是理解错BackgroundWorker的意思了。
    BackgroundWorker好像并不适合做计时用。改用System.Times.Timer了。
    散分了,同时欢迎大家的看法。
      

  5.   

    BackgroundWordker 是等代码执行完了再重新计时.
    Timer 是不管代码执行情况,到时间都会触发.