这种await/async的用法是否正确?

Chi*_*hin 4 .net c# asynchronous task-parallel-library async-await

我是async/await的新手,我想确保这样做是正确的:

public async Task DoHeavyWorkAsync() 
{
    await Task.Run(() => {
        getResponseFromFarawaySlowServerAndDoSomethingWithIt();
    });
}

public async void ConsumeAsync()
{
    Task longRunningTask = DoHeavyWorkAsync();
    // do a lot of other stuffs here that does not depend on DoHeavyWorkAsync()
    await longRunningTask;
}
Run Code Online (Sandbox Code Playgroud)

这种方式是使用异步/等待正确还是我做错了什么?

Yuv*_*kov 7

你可以做几件事:

  1. DoHeavyWorkAsync,你真的不需要使用生成状态机await Task.Run,你可以简单地return Task.Run:

    public Task DoHeavyWorkAsync() 
    {
       return Task.Run(() => getResponseFromFarawaySlowServerAndDoSomethingWithIt());
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. async void仅适用于异步事件处理程序.如果你的异步方法正在void返回,它应该返回一个Task:

    public async Task ConsumeAsync()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果DoHeavyWorkAsync是基于IO的操作,则不需要将其包装在内部,Task.Run因为它本身是异步的.简单地用await就行了.更重要的是,你不应该做同步异步.相反,Task.Run如果需要,您应该明确使用同步方法的调用者:

    public void DoHeavyWork()
    {
        getResponseFromFarawaySlowServerAndDoSomethingWithIt();  
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后显式地将它包装在调用方法中:

    Task.Run(DoHeavyWork);
    
    Run Code Online (Sandbox Code Playgroud)