一度に実行されるmax 2と並行して5つのタスクを完了する必要があります。 したがって、タスクが完了するとすぐに、未処理のタスクがなくなるまで次のタスクを実行する必要があります。Task.Factory.StartNewのランダムタスクは起動しません
私はsolution by L.B.を使用しています。これには、タスク間の同期にセマフォを使用することが含まれます。
void LaunchTaskPool()
{
SemaphoreSlim maxThreadSemaphore = new SemaphoreSlim(2); //Max 2 tasks at a time.
for (int i = 0; i < 5; i++) //loop through 5 tasks to be assigned
{
maxThreadSemaphore.Wait(); //Wait for the queue
Console.WriteLine("Assigning work {0} ", i);
Task t = Task.Factory.StartNew(() =>
{
DoWork(i.ToString()); // assign tasks
}, TaskCreationOptions.LongRunning
)
.ContinueWith(
(task) => maxThreadSemaphore.Release() // step out of the queue
);
}
}
void DoWork(string workname)
{
Thread.Sleep(100);
Console.WriteLine("--work {0} starts", workname);
Thread.Sleep(1000);
Console.WriteLine("--work {0} finishes", workname);
}
問題は、いくつかのランダムなタスクも開始されないということです。ここで例えば、1と3が起動したことがない作業と4が二回実行してしまった作業:
をhereが提案し、それは助けにはならなかったように私はTask.WaitAll()を追加してみました。
ご協力いただきありがとうございます。
コンスタンチン。
https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop -variable-considered-harmful/ –