[英]Task.WhenAll doesn't resume
Below code is simplified version what i am trying to do. 下面的代码是我正在尝试做的简化版本。 The code supposed to reach Console.ReadKey() line very quickly but it never happens. 该代码应该很快到达Console.ReadKey()行,但是它永远不会发生。 Task.WhenAll never resume next line. Task.WhenAll永远不会恢复下一行。 What is wrong on the code ? 代码有什么问题?
class Program
{
static void Main(string[] args)
{
DoWorkAsync().Wait();
Console.ReadKey();
}
static async Task DoWorkAsync()
{
var block = new ActionBlock<Job>(async (task) =>
{
await task.DoAsync();
});
var jobs = Enumerable.Range(0, 2).Select(i => new Job());
foreach (var job in jobs)
{
await block.SendAsync(job);
}
await Task.WhenAll(jobs.Select(c => c.Completion));
}
public class Job
{
TaskCompletionSource<bool> completionSource = new TaskCompletionSource<bool>();
public Task<bool> Completion { get { return completionSource.Task; } }
public async Task DoAsync()
{
await Task.Delay(100);
completionSource.SetResult(true);
}
}
It will help. 我会帮你的。
var jobs = Enumerable.Range(0, 2).Select(i => new Job()).ToList();
It happens because of multiple enumeration of jobs
这是由于jobs
的多次枚举
In this line await Task.WhenAll(jobs.Select(c => c.Completion));
在这一行中, await Task.WhenAll(jobs.Select(c => c.Completion));
you are waiting for new jobs, which are not send to block. 您正在等待新的作业,这些作业不会发送到冻结。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.