任务。什么时候没有恢复

时间:2016-02-14 09:46:49

标签: c# async-await task tpl-dataflow

下面的代码是我想要做的简化版本。该代码应该很快到达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);
        }
    }

1 个答案:

答案 0 :(得分:1)

这会有所帮助。

var jobs = Enumerable.Range(0, 2).Select(i => new Job()).ToList();

这是因为多次枚举jobs

在这一行await Task.WhenAll(jobs.Select(c => c.Completion));中,您正在等待新的作业,这些作业不会发送到阻止。