2 セットの並列タスクを実行しようとしています。私の task.Invoke() メソッドは非同期なので、最初の一連のタスクでは .Wait(); を省略します。しかし、2 番目のセットでは .Wait() を使用して、すべてのタスクが実際に完了するまで並列セットを終了しません。
これは通常、Aグループのタスクが開始され、次にBグループのタスクが開始され、グループAが実行されているグループ内ですべてのタスクが並行して機能し、グループBが実行され、グループbはそのタスクのすべてのタスクが完了するまで終了しません。 .
var parallelA = new List<IMyTask>();
parallelA.Add(new MyTask());
parallelA.Add(new MyTask());
await Task.Run(() => Parallel.ForEach(parallelA, task =>
{
task.Invoke();
}));
var parallelB = new List<IMyTask>();
parallelB.Add(new MyTask());
parallelB.Add(new MyTask());
await Task.Run(() => Parallel.ForEach(parallelB, task =>
{
task.Invoke().Wait();
}));
問題は、タスク b グループが完了する前にグループ a タスクが必ずしも完了するとは限らないため、場合によってはグループ a がまだ実行されている間に関数が終了することです。
おそらく、タスクのコレクションのコレクションを使用して並列ループの並列ループを作成することにより、それらがすべて相互運用できるように書き直すことができると思いますが、clr 内のスレッド管理などに悪影響を与えるのでしょうか?
背景は、間隔を置いて実行されるバックグラウンド プロセスがあることです。実行するタスクを 2 つのグループに分割します。グループ A は実行時間の長いタスクで、グループ B はキューに格納された一連の実行時間の短いタスクです。両方のセットは同じ開始時間と停止時間で同じ優先度を持ち、時間切れになったときにキューを停止することができ、どのタスクも次のサイクルを再開できます。