使用async-await以相反的顺序打印给定阵列

时间:2017-11-16 16:42:17

标签: c# asynchronous

我正在学习asyncawait的使用情况,并尝试执行以下操作:

我有一个特定顺序的数字数组,以及一个获得数字和时间延迟的async方法,并返回相同的传入数字。

我想要实现的是利用时间延迟以相反的顺序(相对于呼叫顺序)打印数字。

我很难搞清楚如何去做,并且很乐意提供指导。这就是我所拥有的(当然,不起作用):

public static async Task<int> DelayAndReturn(int number, int milisecDelay)
{
    await Task.Delay(milisecDelay);
    return number;
}

public static void Main(string[] args)
{
    int[] arr = { 1, 2, 3 };
    int milisecDelay = 10000;
    foreach (int num in arr)
    {
       Console.WriteLine(DelayAndReturn(num, milisecDelay));
       milisecDelay /= 10;
    }
    Console.ReadLine();
}

1 个答案:

答案 0 :(得分:0)

DelayAndReturn返回一个Task对象,获取该对象结果的正确方法是await该任务。但是,等待任务也将停止foreach直到10000毫秒,然后才发送下一个项目进行处理。

请注意,虽然代码执行正在等待异步操作完成,但是其他进程可以自由使用该线程。

以逆序打印它们的最佳选择是创建一系列任务并await所有任务。

public static async Task DelayAndReturn(int number, int milisecDelay)
{
    await Task.Delay(milisecDelay);
    Console.WriteLine(number);
}

public static void Main(string[] args)
{
    PrintReversed().GetAwaiter().GetResult();
}

public static async Task PrintReversed() {
    int[] arr = { 1, 2, 3 };
    int milisecDelay = 1000;

    List<Task> tasks = new List<Task>();
    foreach (int num in arr)
    {
       tasks.Add(DelayAndReturn(num, milisecDelay));
       milisecDelay /= 10;
    }

    await Task.WhenAll(tasks);
}