Winform でバックグラウンド ワーカー スレッドを使用しています。Do_Work イベント内で何かを計算しています。必要なのは、メイン/UI スレッドにあるラベルを同時に更新したいということですか? これを達成する方法は?
Do_Work イベントからラベルを更新したい...
Winform でバックグラウンド ワーカー スレッドを使用しています。Do_Work イベント内で何かを計算しています。必要なのは、メイン/UI スレッドにあるラベルを同時に更新したいということですか? これを達成する方法は?
Do_Work イベントからラベルを更新したい...
WinForms (WPF も同様) では、UI コントロールは UI スレッドでのみ更新できます。この方法でラベルを更新する必要があります。
public void UpdateLabel(String text){
if (label.InvokeRequired)
{
label.Invoke(new Action<string>(UpdateLabel), text);
return;
}
label.Text = text;
}
メソッド内Do_Work
で、オブジェクトのInvoke()
メソッドを使用して、その UI スレッドでデリゲートを実行できます。次に例を示します。
this.Invoke(new Action<string>(UpdateLabel), newValue);
...そして、次のようなメソッドをクラスに追加してください。
private void UpdateLabel(string value)
{
this.lblMyLabel.Text = value;
}
それ(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);
}
私はこの助けを願っています:
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();
}