下面的代码是我想要做的简化版本。该代码应该很快到达Console.ReadKey(),但它永远不会发生。 Task.WhenAll永远不会恢复下一行。代码有什么问题?
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);
}
}
答案 0 :(得分:1)
这会有所帮助。
var jobs = Enumerable.Range(0, 2).Select(i => new Job()).ToList();
这是因为多次枚举jobs
在这一行await Task.WhenAll(jobs.Select(c => c.Completion));
中,您正在等待新的作业,这些作业不会发送到阻止。