假设我有两个异步方法
public async static Task RunAsync1()
{
await Task.Delay(2000);
await Task.Delay(2000);
}
和
public async static Task RunAsync2()
{
var t1 = Task.Delay(2000);
var t2 = Task.Delay(2000);
await t1;
await t2;
}
那我就这样用
public static void M()
{
RunAsync1().GetAwaiter().GetResult();
RunAsync2().GetAwaiter().GetResult();
}
结果 RunAsync1
将运行 4sec 但 RunAsync2
仅 2sec
谁能解释为什么?方法几乎相同。有什么区别?
最佳答案
在第二种方法中,2 个任务同时启动。它们都将在 2 秒内完成(因为它们是并行运行的)。在第一种方法中,您首先运行一个方法(2 秒),等待它完成,然后启动第二个方法(再过 2 秒)。这里的关键点是 Task.Delay(..)
在您调用它时开始,而不是在您等待它时开始。
为了更清楚地说明,第一种方法:
var t1 = Task.Delay(2000); // this task is running now
await t1; // returns 2 seconds later
var t2 = Task.Delay(2000); // this task is running now
await t2; // returns 2 more seconds later
第二种方法:
var t1 = Task.Delay(2000);
var t2 = Task.Delay(2000); // both are running now
await t1; // returns in about 2 seconds
await t2; // returns almost immediately, because t2 is already running for 2 seconds
关于c# - 几乎相同方法中的不同行为异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44718236/