ここには明らかな何かが欠けていると思いますが、タスクを使用して値を取得するときに GUI を更新するにはどうすればよいですか? (BackgroundWorker の代わりに await/async を使用しようとしています)
私のコントロールでは、ユーザーは時間がかかることをするボタンをクリックしました。進行状況を表示できるように、親フォームに警告したい:
private void ButtonClicked()
{
var task = Task<bool>.Factory.StartNew(() =>
{
WorkStarted(this, new EventArgs());
Thread.Sleep(5000);
WorkComplete(this, null);
return true;
});
if (task.Result) MessageBox.Show("Success!");//this line causes app to block
}
私の親フォームでは、ステータス バーを更新するために WorkStarted と WorkComplete をリッスンしています。
myControl.WorkStarting += (o, args) =>
{
Invoke((MethodInvoker) delegate
{
toolStripProgressBar1.Visible = true;
toolStripStatusLabel1.Text = "Busy";
});
};
私が間違っている場合は修正してください。ただし、「Invoke」が GUI スレッドが使用可能になるのを待っているため、アプリがハングしていますが、「ButtonClicked()」呼び出しが完了するまで使用できません。そのため、デッドロックが発生しています。これにアプローチする正しい方法は何ですか?