한 번에 최대 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);
}
문제는 임의의 작업이 시작되지 않는다는 것입니다.
내가 제안 here로 Task.WaitAll()를 추가했지만, 그것은 도움이되지 않았다 예를 들어 여기에 1, 시작되지 및 워크 4는 두 번 실행있어 결코 3 작업 할 수 있습니다.
미리 감사드립니다.
콘스탄틴.
https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop을 -variable-considered-harmful/ –