1. backgroundwork.DoWork事件里能否用 this.Invoke()来修改主线程里的控件?
我想在DoWork事件里,去修改程序上的控件,用this.Invoke()这个方法来修改,可以吗?
2. 还有DoWork不能修改主线程的控件,为什么这段代码却能正常运行?        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
           this.label1.Text = "开始";
        }这个属性我没动过 CheckForIllegalCrossThreadCalls
3.还有,有时第一个backgroundwork还没执行完时,再次执行backgroundwork 就会报错!!
 ---此 BackgroundWorker 当前正忙,无法同时运行多个任务。
有什么办法能防止再次执行吗?

解决方案 »

  1.   

    爱莫能助。我从不用微软这个类。线程就可以了。从操作系统层面看。没有他搞的这玩意。用线程就很好了。
    new Thread((ThreadStart)delegate
    {
        //DoWork
        this.Invoke((EventHandler)delegate{this.label1.Text = "开始";});
    }).Start();
      

  2.   

    3.还有,有时第一个backgroundwork还没执行完时,再次执行backgroundwork 就会报错!!
     ---此 BackgroundWorker 当前正忙,无法同时运行多个任务。
    有什么办法能防止再次执行吗?一个简单的方法是设置一个静态变量,初值设为true, dowork前先检测,如果是true,就继续,并且把变量设为false, 否则中止, bakcgroundworker发生completed事件时把它设成true
      

  3.   

    子线程不可以直接操作主线程里的控件,为了线程安全的问题,使用INVOKE或BEGININVOKE可以操控的,但是其实不是子线程直接操控,相当于把操控控件的函数地址委托给主线程,让主线程来执行
      

  4.   

    1、你不需要用它this.Invoke来处理,在backgroundwork可以访问主线程的空间,例如:this.Text = "开始解压文件导入数据";
    this.richTextBox1.Text += "在现有的zip文件包中找不到需要解压和导入的文本文件,请检查zip包是否正确?或者重新下载后再解压!\n";
    2、如上所述,不需要特殊处理,就可以访问主线程的类3、如果你是通过点击按钮后,执行的代码,那么你可以把你的代码重构一下,button中调用一个方法,而且,调用后,就将button.Enabled设置成false,实现点击一次后,必须等待到后台线程处理完毕,在RunWorkerCompleted事件中,重新设置button.Enabled=true;
      

  5.   

    3.还有,有时第一个backgroundwork还没执行完时,再次执行backgroundwork 就会报错!!
     ---此 BackgroundWorker 当前正忙,无法同时运行多个任务。shit,刚发现backgroundworker有个IsBusy属性,直接检测一下就好了