async/await 方法调用有什么用?

What is the use of async/await method calls?

在我项目的代码库中,我看到很多方法归结为以下代码:

public async Task<bool> MyAsyncFunction(string filePath) 
{
   byte[] fileBytes = await File.ReadAllBytesAsync(filePath);
   bool succeeded = await UploadFileSomewhereAsync(fileBytes);

   return succeeded;
}

我知道 async/await 对于前端代码中的非阻塞 UI 任务很有用。我还了解到 async/await 可用于 运行 某些并行任务,如下面的代码所示:

public async Task<bool> MyAsyncFunction(string filePath) 
{
   Task<byte[]> fileBytesTask = File.ReadAllBytesAsync(filePath);

   // do some other work that does not need the file byte array

   byte[] fileBytes = await fileBytesTask;
   bool succeeded = await UploadFileSomewhereAsync(fileBytes);

   return succeeded;
}

但是,async/await 模式在第一个例子中的使用情况如何?与简单地调用这些方法的同步版本相比,编写这样的代码有什么好处吗?我错过了什么吗?

进一步阐述 Stephen Clearys 的评论

异步代码有两个主要用例。

  1. 对于 UI 应用程序,您不希望在执行一些缓慢的 IO 操作时冻结您的 UI,例如读取大文件或执行一些进程密集型操作。
  2. 对于服务器应用程序,您不希望在等待慢速 IO 操作时消耗线程。许多服务器都是相当简单的数据库前端。如果您有 1000 个并发查询并且正在使用同步代码,您可能需要 1000 个线程等待。线程使用一些资源,如内存,当试图为大量并发用户提供服务时,这会变得很浪费。

编写异步代码的旧方法有点难以使用,因为您需要手动跟踪 IO 操作完成后需要完成的所有事情。 Async/awaits 通过让编译器完成困难的部分,让您编写看起来像常规顺序代码的代码,在很大程度上避免了这种情况。

对async/await的批评是,有时使用同步方法会更好。因此,您可能需要编写两个版本的基本相同的代码。