【发布时间】:2017-09-26 16:24:00
【问题描述】:
我需要同时完成 5 个任务,一次最多执行 2 个任务。 因此,一旦某个任务完成,下一个任务应该运行 - 直到没有待处理的任务为止。
我正在使用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);
}
问题是一些随机任务甚至无法启动。例如,这里的 Work 1 和 3 从未启动,而 Work 4 运行了两次:
我尝试按照here 的建议添加 Task.WaitAll(),但没有帮助。
提前感谢您的建议!
康斯坦丁。
【问题讨论】:
标签: c# semaphore multitasking