使用异步等待时,Console.Writeline仅在某些时候写入控制台

时间:2019-03-04 23:14:34

标签: c# async-await

所以,我有一个非常简单的应用程序,但是在测试时,它只是从DoWork()方法写入控制台。我不确定为什么会这样,但是我相当确定这与异步代码有关。有什么想法,为什么只从方法DoWork()编写?

class Program
{
    static void Main(string[] args)
    {
        MainAsync().Wait();
        System.Threading.Thread.Sleep(50000);
    }

    static async Task MainAsync()
    {
        Console.WriteLine("Hello World!");

        for (int i = 0; i < 300; i++)
        {
            List<Task> myWork = new List<Task>();
            myWork.Add(DoWork(i));
            if (myWork.Count == 50)
            {
                await Task.WhenAll(myWork);
                Console.WriteLine("before delay");
                await Task.Delay(1000);
                Console.WriteLine("after delay");
                myWork.Clear();
                Console.WriteLine("List cleared.");
            }
        }


    }

    public static async Task DoWork(int i)
    {
        await Task.Delay(0);
        Console.WriteLine("Run: " + i);
    }
}

1 个答案:

答案 0 :(得分:3)

您正在为循环的每次迭代创建一个新列表...它将只包含一件事。

声明循环的外部列表。

更改:

    for (int i = 0; i < 300; i++)
    {
        List<Task> myWork = new List<Task>();

收件人:

    List<Task> myWork = new List<Task>();
    for (int i = 0; i < 300; i++)
    {