我用timer每秒执行backgroundworker中的代码,在complete中总是出现"线程不安全"提示,就是控件的安全性调用问题.
我的WINFORM中使用了多个backgroundworker代码如下:
//定时器启动
             m_Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
            m_Timer.AutoReset = true;
            m_Timer.Enabled = true;//dowork
            private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            String returnMsg = m_SMS();
            //返回信息
            e.Result = returnMsg;
        }//Completeprivate void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   this.label1.Text = e.Result.ToString();//就这一句出现线程安全提示
}我看了MSDN,上述代码没发现什么异常,不知道是不是定时器引起的?

解决方案 »

  1.   

    //定时器代码
    private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                if (!this.bgWorker.IsBusy)
                {
                    //执行后台操作
                    this.bgWorker.RunWorkerAsync();
                }
            }
      

  2.   

    这样就没事了using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    namespace WindowsApplication6
    {
        public partial class Form1 : Form
        {        
            public Form1()
            {
                InitializeComponent();            System.Windows.Forms.Timer m_Timer = new System.Windows.Forms.Timer();            
                m_Timer.Tick += new System.EventHandler(this.m_Timer_Tick);
                m_Timer.Interval = 2000;
                m_Timer.Enabled = true;
            }        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                Thread.Sleep(3000);
                String returnMsg = DateTime.Now.ToString();
                //返回信息 
                e.Result = returnMsg;             
            }        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                label1.Text = e.Result.ToString();//就这一句出现线程安全提示 
            }        //定时器代码 
            private void m_Timer_Tick(object sender, EventArgs e)
            {
                if (!this.backgroundWorker1.IsBusy)
                {
                    //执行后台操作 
                    this.backgroundWorker1.RunWorkerAsync();
                }
            }    }
    }
      

  3.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;/*
     * 作者:周公
     * BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
     * 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
     * 它有几个属性:
     * CancellationPending——指示应用程序是否已请求取消后台操作。
     * IsBusy——指示 BackgroundWorker 是否正在运行异步操作
     * WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新
     * WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消
     * 还有如下事件:
     * DoWork——调用 RunWorkerAsync 时发生。
     * ProgressChanged——调用 ReportProgress 时发生。
     * RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。
     * 
     * 还有如下方法:
     * CancelAsync——请求取消挂起的后台操作
     * ReportProgress——引发 ProgressChanged 事件
     * RunWorkerAsync——开始执行后台操作
     * 
     **/
    namespace BackgroundWorkerDemo
    {
        public partial class MainForm : Form
        {
            private BackgroundWorker worker = new BackgroundWorker();
            public MainForm()
            {
                InitializeComponent();
                worker.WorkerReportsProgress = true;
                worker.WorkerSupportsCancellation = true;
                //正式做事情的地方
                worker.DoWork+=new DoWorkEventHandler(DoWork);
                //任务完称时要做的,比如提示等等
                worker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
                //任务进行时,报告进度
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
            }        //调用 RunWorkerAsync 时发生
            public void DoWork(object sender, DoWorkEventArgs e)
            {
                e.Result = ComputeFibonacci(worker, e);//当ComputeFibonacci(worker, e)返回时,异步过程结束
            }
            //调用 ReportProgress 时发生
            public void ProgessChanged(object sender, ProgressChangedEventArgs e)
            {
                this.progressBar1.Value = e.ProgressPercentage;
            }
            //当后台操作已完成、被取消或引发异常时发生
            public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show("完成!");
            }        private int ComputeFibonacci(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i < 1000; i++)
                {
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                        return -1;
                    }
                    else
                    {
                        worker.ReportProgress(i);
                    }
                    System.Threading.Thread.Sleep(10);
                }
                return -1;
            }        private void btnStart_Click(object sender, EventArgs e)
            {
                worker.RunWorkerAsync();
                btnStart.Enabled = false;
                btnPause.Enabled = true;
            }        private void btnPause_Click(object sender, EventArgs e)
            {
                btnPause.Enabled = false;
                btnStart.Enabled = true;
                worker.CancelAsync();
            }
        }
    }
      

  4.   

    多谢楼上的各位.Timer换成window.form.timer就行了