简体   繁体   English

Task.WhenAll无法恢复

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM