我正在学习async
和await
的使用情况,并尝试执行以下操作:
我有一个特定顺序的数字数组,以及一个获得数字和时间延迟的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();
}
答案 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);
}