只有在等待返回的任务后才最终执行吗?

Is finally executed only after a returned Task is awaited?

我有一个 asnyc 方法,它 return 是一个任务,正在 finally 块中做一些清理工作:

public Task<byte[]> MyFunction() {
   string filename = CreateFile();
   try {
      return File.ReadAllBytesAsync(filename);
   } finally {
      File.Delete(filename);
   }
}

是否保证只有在等待 return 值后才会调用 finally 块,或者这是否会造成文件在完全读取之前被删除的竞争条件?

不保证不会创建该文件。您需要等待呼叫(另请注意 async 关键字):

public async Task<byte[]> MyFunction() {
   string filename;
   try {
      filename = CreateFile();
      return await File.ReadAllBytesAsync(filename);
   } finally {
      File.Delete(filename);
   }
}

如果没有等待呼叫,那么您 return 仍然 运行 任务,并且很可能在文件被删除之前无法完成。这肯定是竞​​争条件。

它不仅不会等待任何东西,它也不会编译。您需要执行几个步骤:

  1. 制作方法async
  2. 实际上 await File.ReadAllBytesAsync
  3. 的结果
  4. 在 try-finally 块之外声明 filename 变量