我正在将任务与ContinueWith链接并等待所有任务。 当我在循环中引入延迟时(注释 - 这意味着有足够的时间完成任务(,我可以看到所有任务都已完成。当我删除延迟时,我只能看到处理了第一条消息。其余消息将不予处理。我假设代码在完成所有任务之前退出方法。不确定我是否等待错误。
如何确保我的所有任务都已完成,而不会在循环中引入延迟?
using (var throttler = new SemaphoreSlim(initialConcurrentJobsCount, maxConcurrentJobsCount))
{
for(int counter = 0; counter < msgs.Length; counter++)
{
tasks[counter] = throttler.WaitAsync()
.ContinueWith(r => new VirtualMachineActor().HandleAsync(msgs[counter]))
.ContinueWith(o => throttler.Release());
// When below line is present, all tasks are completed properly.
// When removed only first msg is executed.
await Task.Delay(1000);
}
await Task.WhenAll(tasks);
}
为了其他人的利益,"ContinueWith"链并不一定意味着任务执行的顺序。它是一个包装器,因此需要"解包"。