実行したい長時間実行されているタスクがあり、そのステータス/進行状況をユーザー インターフェイスに通知できるとします。ここでの問題は、必要な UI がモーダル ダイアログであり、タスクを開始する前にそれを表示することも、タスクを開始してから表示することもできないことです。
試行 1: 最初にダイアログを表示してから、タスクを開始します。
ProgressDialog dlg = new ProgressDialog();
Task longRunningTask = CreateTask();
dlg.ShowDialog();
longRunningTask.Start();
Task.WaitAll(longRunningTask);
これは明らかに機能しません。スレッドは ShowDialog() でブロックされ、タスクは開始されません。
試行 2: タスクを開始してからダイアログを表示:
ProgressDialog dlg = new ProgressDialog();
Task longRunningTask = CreateTask();
longRunningTask.Start();
dlg.ShowDialog();
Task.WaitAll(longRunningTask);
しかし、このシナリオでは、タスクからの最初の進捗イベントを見逃す危険があります。さらに悪いことに、最初のイベントが作成中に進捗ダイアログに到着するため、"InvokeRequired" が false になったときに恐ろしいクロススレッド例外が発生します。まだ表示されていないため、ハンドルはありません。
タスクをダイアログに渡して、ダイアログにタスクを開始させることができると思いますが、それを必要としないこの問題に対するエレガントな解決策があるように感じますか?