立即等待或稍后等待的区别

Jam*_*ees 5 c# asynchronous async-await

我找不到有关实际差异的任何信息。

所以我一直在做以下事情:

public async Task<int> DoSomethingAsync()
{
    DoSomethingElse()
    var result = await GetValueAsync();
    var intValue = DoAnotherThing(result);
    return intValue;
}
Run Code Online (Sandbox Code Playgroud)

await 电话,然后直接使用它,但我最近看到一些帖子,人们正在做以下事情:

public async Task<int> DoSomethingAsync()
{    
    var task = GetValueAsync();
    DoSomethingElse()
    var result = await task;
    var intValue = DoAnotherThing(result);
    return intValue;
}
Run Code Online (Sandbox Code Playgroud)

那么这是否意味着该方法GetValueAsync正在开始执行,然后我们稍后等待它的结果?或者这是否意味着它正在同步执行但它仍然await能够?

der*_*asp 6

Damien_The_Unbeliever 说得对,这取决于实现。

class Program
{
    public static int DoAnotherThing(string value)
    {
        return int.Parse(value);
    }

    public static async Task<string> GetValueAsync()
    {
        await Task.Delay(5000);
        return "12";
    }

    public static void DoSomethingElse()
    {
        Thread.Sleep(5000);
    }

    public static async Task<int> DoSomethingAsyncA()
    {
        DoSomethingElse();
        var result = await GetValueAsync();
        var intValue = DoAnotherThing(result);
        return intValue;
    }

    public static async Task<int> DoSomethingAsyncB()
    {
        var task = GetValueAsync();
        DoSomethingElse();
        var result = await task;
        var intValue = DoAnotherThing(result);
        return intValue;
    }

    public static void Measure(Action act)
    {
        var sw = new Stopwatch();

        sw.Start();

        act();

        sw.Stop();

        Console.WriteLine(sw.Elapsed);
    }

    static void Main(string[] args)
    {
        Measure(() => DoSomethingAsyncA().Wait());
        Measure(() => DoSomethingAsyncB().Wait());

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下DoSomethingAsyncB将需要约 5 秒,其中DoSomethingAsyncA将需要约 10秒。但是,如果您GetValueAsync返回的值计算是在其他地方开始的,那么将没有区别。

更新 我更正了答案中的错误。这是我机器的输出:

  00:00:10:0161446
  00:00:05:0032000
Run Code Online (Sandbox Code Playgroud)