2

メインUIスレッドから処理するために、次のジョブを複数のスレッドに送信しました。すべてのジョブが完了したら、「ジョブが完了しました」というメッセージを発行して、完了したことをユーザーに知らせる必要があります。

LimitedTaskScheduler scheduler = new LimitedTaskScheduler(4);
TaskFactory factory = new TaskFactory(scheduler);
MessageBox.Show("Job started");
for (int i = 0; i < rows.Length; i++)
{
  string tabName = rows[i]["TableName"].ToString();
  int nStatus;
  factory.StartNew<int>(() =>
  {
   nStatus = ProcessTable(tabName);
   return nStatus;
  });
}
MessageBox.Show("Job finished");

上記のコードでは、 MessageBox.Show("Job finished"); タスクが送信された直後に実行されますが、これは間違っています。Task.WaitAll(); を使用する場合 それは私が望んでいないメインのUIスレッドをロックします。

私の質問は、メインの UI スレッドをロックせずに、すべてのタスクが完了した後に「ジョブが終了しました」というメッセージを表示する最良の方法は何ですか?

前もって感謝します。

4

2 に答える 2

1

ユーザーに通知するだけでよい場合は、タスクの継続を作成し、UIスレッドでTaskSchedulerの呼び出しによって取得したものを渡します。TaskScheduler.FromCurrentSynchronizationContext

この継続は、親タスクが完了した後、UIスレッドで実行されます。

于 2013-01-21T20:27:07.700 に答える
1

を使用して、他のすべてのタスクが終了したTask.WhenAll()に終了する新しいタスクを作成する必要があります。

その後ContinueWith()、そのタスクを呼び出して、UI スレッドでコールバックを実行できます。

于 2013-01-21T20:24:34.560 に答える