-2
私はいくつかのタスクを並列に実行するコンソールアプリケーションを持っています。私の場合、重要なのは、タスクを同時に完了したいということです。私はどのくらいの時間を要するかを知っています。そのため、Parallel.ForEach内のすべてのタスクを何らかの方法で遅延させ、すべてのタスクが同時に完了し、最終的にはすべてのタスクがほぼ同時に完了するようになります。異なる時刻にパラレルタスクを実行
例:
interface IService
{
void DoWork();
}
class Program
{
static void Main(string[] args)
{
var services = new List<IService>();
services.Add(new ServiceA());//Takes 500ms to DoWork()
services.Add(new ServiceB());//Takes 1000ms to DoWork()
services.Add(new ServiceC());//Takes 5000ms to DoWork()
Parallel.ForEach(services, z =>
{
Stopwatch sw = new Stopwatch();
sw.Start();
z.DoWork();
Console.WriteLine($"Ready for {sw.Elapsed}");
});
}
}
出力:
Ready for 00:00:00.5006837
Ready for 00:00:01.0002284
Ready for 00:00:05.0010202
Press any key to continue . . .
どのように出力は次のようになりますので、コードを変更する:私が最も明白な解決策は、になります推測
Ready for 00:00:05.5006837
Ready for 00:00:05.0002284
Ready for 00:00:05.0010202
Press any key to continue . . .
どのサービスがループ内でzであるかを区別し、z.DoWork()を呼び出す前にカスタムThread.Sleepを追加しますが、私はlookinですgよりスマートなソリューション
単にすべてのタスクが同時に完了することは保証できません。ただし、続行する前にそれらのすべてが完了するのを待つことができます。 Task.WaitAll()のドキュメントを見てください。 – legrojan
複数の完全に異なる並列化パラダイムを同時に使用しないでください。 *タスクを使用するか、*または* Parallelクラスを使用します。両方を使用しないでください。 'Task'コンストラクタも使うべきではありません。スレッドプールスレッドでいくつかの関数を実行する 'Task'を作成したい場合は、代わりに' Task.Run'を使って既に開始したタスクを作成してください。 – Servy
私はそれらが同時に完了するのは望ましくないが、ほぼ同じ時間に数ミリ秒の差を付けて – IIvanov