private void Form1_Load(object sender, EventArgs e)
        {
            this.timer1.Enabled = true;            label3.Text = Convert.ToString(DateTime.Now.TimeOfDay).Substring(0, 8);
        }        private void timer1_Tick(object sender, EventArgs e)
        {
            label3.Text = Convert.ToString(DateTime.Now.TimeOfDay).Substring(0, 8);
        }        private void button1_Click(object sender, EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            backgroundWorker1.RunWorkerAsync(this.textBox2.Text);
        }        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker work = (BackgroundWorker)sender;
            e.Result = CheckAlarm(e.Argument.ToString(), work, e);
        }
        private bool CheckAlarm(string str, BackgroundWorker work, DoWorkEventArgs e)
        {
            while (true)
            {
                if (work.CancellationPending)
                    e.Cancel = true;
                else
                {
                    if (label3.Text == str)
                        return true;
                }
            }
        }        private void button2_Click(object sender, EventArgs e)
        {
            this.backgroundWorker1.CancelAsync();
            this.Cursor = Cursors.Default;
        }        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
                MessageBox.Show(e.Error.Message);
            else if (e.Cancelled)
            {
                MessageBox.Show("Cancelled");
            }
            else
            {
                Application.Exit();
            }
        }这是一个backgroundwork的教学事例 但是有个问题 就是 这个backgroundwork不能cancel
如果运行以后cannel 在重新set
就会报"backgroundwork 无法运行多个任务的" 错误
代码奉上 好心人能否帮助我解决或者告诉我报错的原因
我先前做了一个10000个整数的连加程序 就可以cancel 在重新set就不报错
但是我发现不了两段代码有什么区别

解决方案 »

  1.   

    private void button2_Click(object sender, EventArgs e) 
            { 
                this.backgroundWorker1.CancelAsync(); 
                this.Cursor = Cursors.Default; 
            } 
    我想你cancel的这段需要修正为:
    private void button2_Click(object sender, EventArgs e) 
            { 
                if(this.backgroundWorker.CancellationPending) return;            if(this.backgroundWorker.IsBusy)
                {
                    this.backgroundWorker.CancelAsync();
                    return;
                }
            } 试试看吧,希望有帮助。
      

  2.   

    [code=BatchFile]
            private bool CheckAlarm(string str, BackgroundWorker work, DoWorkEventArgs e)
            {
                while (true && !e.Cancel)
                {
                    if (work.CancellationPending)
                    {
                        e.Cancel = true;
                    }
                    else
                    {
                        if (label3.Text == str)
                            return true;
                    }
                }            return false;
            }
    [/code]