2012-06-26 62 views
2

我在我的Winform中使用后台工作线程,在我的Do_Work事件中我正在计算一些东西,我需要的是同时我想更新一个标签,它是在主/ UI线程?如何实现这一目标?在运行后台UI中更新控件Winforms中的线程

我想更新从Do_Work事件我的标签......

+1

见ReportProgress方法和ProgressChanged事件。你可以传递一个字符串作为用户数据。 –

回答

1

里面你Do_Work方法,你可以使用对象的Invoke()方法,其UI线程执行的委托,如:

this.Invoke(new Action<string>(UpdateLabel), newValue); 

...然后确保这样的方法添加到您的类:

private void UpdateLabel(string value) 
{ 
    this.lblMyLabel.Text = value; 
} 
0

我希望这帮助:

int x = 0; 
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

     label1.Text = x.ToString(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     x++; 
     //you can put any value 
     backgroundWorker1.ReportProgress(0); 
    } 

    private void button6_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 
+0

对不起,但这段代码真的没有什么帮助,即使这段代码给出了一个异常 - “backgroundWorker1.ReportProgress(0);” – user1444231

+0

你是否设置了WorkerReportsProgress为true?如果你这样做,请给我例外消息 –

5

在WinForms(也是WPF)中,UI控件只能在UI线程中更新。您应该更新您的标签是这样的:

public void UpdateLabel(String text){ 
    if (label.InvokeRequired) 
    { 
     label.Invoke(new Action<string>(UpdateLabel), text); 
     return; 
    }  
    label.Text = text; 
} 
0

您是用户界面(标签)更新过程中面临着跨线程异常的问题,因为它(UI)是在不同的线程(mainThread)。您可以与许多走像TPL,线程池,等等等等,但简单的方式选择,做你想要的是写在你的Do_Work方法简单的动作如

私人无效backgroundWorker1_DoWork(对象发件人,DoWorkEventArgs E)

{ 
    x++; 
    //you can put any value 
    Action = act =()=> 
      { 
       label.Text = Convert.ToString(x); 
      }; 
    if (label.InvokeRequired) 
     label.BeginInvoke(act); 
    else 
      label.Invoke(act); 
    backgroundWorker1.ReportProgress(0); 
}