向Form中拖入一个BackgroundWorker(Name:backgroundWorker1),
backgroundWorker1_DoWork的内容是:private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    label1.Text = "OK";
}Form中button1的Click:private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}
点击按钮button1出现错误:“线程间操作无效: 从不是创建控件“label1”的线程访问它。”
我对线程不太懂,请指点一下BackgroundWorker调用控件的方法。

解决方案 »

  1.   

    CheckForIllegalCrossThreadCalls = false;
      

  2.   

    不是说BackgroundWorker可以解决“线程间控件操作”的问题吗?
    我也是想解决Timer的方法中无法实现“线程间控件操作”,才试BackgroundWorker的。
      

  3.   

    当你调用 backgroundWorker1.RunWorkerAsync(); 方法之后,
    控件将会新建一个线程 执行 backgroundWorker1_DoWork 的 代码,而label1 控件并不是在这个新建的线程中创建的 所以调试的时候报错。因该在backgroundWorker1_ProgressChanged的方法里 执行你需要更新 界面的代码。 
      

  4.   

    触发事件 ProgressChanged,之后 就会回到 主线程上 执行backgroundWorker1_ProgressChanged里的代码,
      

  5.   

    BackgroundWorker _backgroundworker = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
            private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker backgroundworker = sender as BackgroundWorker;
                backgroundworker.ReportProgress(0);
    }        private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
               label1.Text = "OK";
             }
      

  6.   

    首先搞明白几个问题:1.Winform下的控件不是线程安全的,WPF的控件可以做到线程安全2.BackgroundWorker的三个事件:DoWork是跑在一个线程中的,ProgressChanged和RunWorkerCompleted事件是跑在主线程下的,所以实际上一个Worker开了两个线程
    private void button1_Click(object sender, EventArgs e)
    {
    [align=left][align=center]string tip=string.empty;
    BackGroundworker worker=new BackGroundworker();worker.DoWork+=new DoWorkEventHandler((sender,e)=>
    {
    //ToDo
    this.tip="OK";
    });worker.ProgressChanged+= new ProgressChangedEventHandler((sender,e)=>
    {
    //ToDo->tip
    });worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler((sender,e)=>
    {
    //ToDo->tip
    });[/align][/align]
    }
      

  7.   

    private void button1_Click(object sender, EventArgs e)
    {
        string tip=string.empty; 
        BackGroundworker worker=new BackGroundworker(); 
        worker.DoWork+=new DoWorkEventHandler((sender,e)=> 
           { 
              //ToDo this.tip="OK";
            });     worker.ProgressChanged+= new ProgressChangedEventHandler((sender,e)=> 
           {
              //ToDo->tip 
            });     worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler((sender,e)=> 
           {
               //ToDo->tip 
            });
    }