c# - 几乎相同方法中的不同行为异步/等待

标签 c# .net async-await

假设我有两个异步方法

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 将运行 4secRunAsync22sec
谁能解释为什么?方法几乎相同。有什么区别?

最佳答案

在第二种方法中,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/

相关文章:

C# 泛型 : there is no way to constrain a type to have a static method?

javascript - 获取正确的数据,但未达到我的预期

javascript - 在 react 类中设置等待设置状态可以吗?

c# - .NET 中用于故障测试的损坏数据集

javascript - SyntaxError : missing ) after argument list, 使用异步时

c# - 结构中的 Main() 与类中的 Main() 有区别吗?

c# - SQL Datareader 空值

c# - 方法未从任务委托(delegate)中调用

asp.net - 在 Asp.Net vnext 下设置 NodaTime

.net - 在 Blazor 组件中的 @ChildContent 上设置 CSS 类