我怎么能等待一个无效异步方法完成它的工作?
例如,我有一个这样的函数:
async void LoadBlahBlah()
{
await blah();
...
}
现在我想确保在继续其他地方之前所有东西都已加载。
我怎么能等待一个无效异步方法完成它的工作?
例如,我有一个这样的函数:
async void LoadBlahBlah()
{
await blah();
...
}
现在我想确保在继续其他地方之前所有东西都已加载。
当前回答
你实际上不需要手动做任何事情,await关键字暂停函数执行,直到blah()返回。
private async void SomeFunction()
{
var x = await LoadBlahBlah(); <- Function is not paused
//rest of the code get's executed even if LoadBlahBlah() is still executing
}
private async Task<T> LoadBlahBlah()
{
await DoStuff(); <- function is paused
await DoMoreStuff();
}
T是blah()返回的对象类型
你不能真的等待一个void函数,所以LoadBlahBlah()不能为void
其他回答
最佳实践是仅当函数是fire and forget方法时才将其标记为async void,如果你想等待,则应将其标记为async Task。
如果你仍然想等待,那么就像这样包装它。
我已经阅读了所有的解决方案,它真的很复杂…最简单的解决方案是返回bool类型:
async bool LoadBlahBlah()
{
await blah();
return true;
}
存储或检查返回值不是强制的。你可以这样做:
await LoadBlahBlah();
... 如果出错,你可以返回false。
你实际上不需要手动做任何事情,await关键字暂停函数执行,直到blah()返回。
private async void SomeFunction()
{
var x = await LoadBlahBlah(); <- Function is not paused
//rest of the code get's executed even if LoadBlahBlah() is still executing
}
private async Task<T> LoadBlahBlah()
{
await DoStuff(); <- function is paused
await DoMoreStuff();
}
T是blah()返回的对象类型
你不能真的等待一个void函数,所以LoadBlahBlah()不能为void
如果可以将函数的签名更改为async Task,则可以使用这里提供的代码
您可以简单地将返回类型更改为Task并调用await Task。函数末尾的CompletedTask,例如:
async Task MyFunction() {
await AnotherFunction();
await Task.CompletedTask;
}
我发现这比将整个函数体包装在对task的调用中更简单。run(() =>{…});。