等待来自ContinueWith链接的任务

时间:2017-02-14 01:01:48

标签: c# asynchronous async-await task continuewith

我正在使用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);
}

1 个答案:

答案 0 :(得分:0)

为了他人的利益,“ContinueWith”链并不一定意味着任务执行的顺序。它是一个包装器,因此需要“UnWrap”。