控制台应用程序中正确的异步循环

时间:2018-08-27 07:22:14

标签: c# async-await

我知道异步I / O不会带来并行性,但是我认为当应用程序正在等待异步操作时,它可以继续进行其他操作。

考虑下面的代码,我希望循环在等待Wait(i)时继续进行,但是显然我错了,每次迭代都阻塞了。在这里实现一些并发的正确方法是什么?

using System;
using System.Threading.Tasks;

namespace asynctest
{
    class Program
    {
        static void Main(string[] args)
        {
            Do().GetAwaiter().GetResult();
        }

        public static async Task Do()
        {   
            for(int i=0;i<10;i++)
            {
                await Wait(i);
            }
        }

        public static async Task Wait(int i)
        {
            await Task.Delay(10000);
        }
    }
}

2 个答案:

答案 0 :(得分:4)

public static async Task Do()
{
    var tasks = new Task[10];
    for (int i = 0; i < 10; i++)
    {
        tasks[i] = Wait(i);
    }

    await Task.WhenAll(tasks);
}

答案 1 :(得分:0)

您应该使用WhenAll()组合任务结果,这样您的任务才能并行运行:

namespace asynctest
{
    class Program
    {
        static void Main(string[] args)
        {
            Do().GetAwaiter().GetResult();
        }

        public static async Task Do()
        {   
            for(int i=0;i<10;i++)
            {

              var task1 = Wait(5000);
              var task2 = Wait(3000);   
              int[] result = await Task.WhenAll(task1, task2);
              Console.WriteLine("waited for a total of " + result.Sum() + " ms");          
            }
        }

        public static async Task<int> Wait(int i)
        {
            await Task.Delay(i);
            return i;
        }
    }
}