3

Winform でバックグラウンド ワーカー スレッドを使用しています。Do_Work イベント内で何かを計算しています。必要なのは、メイン/UI スレッドにあるラベルを同時に更新したいということですか? これを達成する方法は?

Do_Work イベントからラベルを更新したい...

4

5 に答える 5

9

WinForms (WPF も同様) では、UI コントロールは UI スレッドでのみ更新できます。この方法でラベルを更新する必要があります。

public void UpdateLabel(String text){
    if (label.InvokeRequired)
    {
        label.Invoke(new Action<string>(UpdateLabel), text);
        return;
    }      
    label.Text = text;
}
于 2012-06-26T16:52:14.520 に答える
1

メソッド内Do_Workで、オブジェクトのInvoke()メソッドを使用して、その UI スレッドでデリゲートを実行できます。次に例を示します。

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

...そして、次のようなメソッドをクラスに追加してください。

private void UpdateLabel(string value)
{
    this.lblMyLabel.Text = value;
}
于 2012-06-26T16:13:09.713 に答える
0

それ(UI)が異なるスレッド(mainThread)にあるため、ユーザーインターフェイス(ラベル)の更新中にクロススレッド例外の問題に直面しています。TPL、ThreadPool、何とか何とかなどの多くのオプションを使用できますが、簡単な方法で実行できますDo_Work メソッドに単純な Action を次のように記述します。

private void 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);
}
于 2012-07-14T21:34:52.047 に答える
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();
    }
于 2012-06-26T16:47:52.637 に答える