只有在等待返回的任务后才最终执行吗?
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 仍然 运行 任务,并且很可能在文件被删除之前无法完成。这肯定是竞争条件。
它不仅不会等待任何东西,它也不会编译。您需要执行几个步骤:
- 制作方法
async
- 实际上
await
File.ReadAllBytesAsync
的结果
- 在 try-finally 块之外声明
filename
变量
我有一个 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 仍然 运行 任务,并且很可能在文件被删除之前无法完成。这肯定是竞争条件。
它不仅不会等待任何东西,它也不会编译。您需要执行几个步骤:
- 制作方法
async
- 实际上
await
File.ReadAllBytesAsync
的结果
- 在 try-finally 块之外声明
filename
变量