我怎么能等待一个无效异步方法完成它的工作?

例如,我有一个这样的函数:

async void LoadBlahBlah()
{
    await blah();
    ...
}

现在我想确保在继续其他地方之前所有东西都已加载。


当前回答

您可以简单地将返回类型更改为Task并调用await Task。函数末尾的CompletedTask,例如:

async Task MyFunction() {
    await AnotherFunction();

    await Task.CompletedTask;
}

我发现这比将整个函数体包装在对task的调用中更简单。run(() =>{…});。

其他回答

如果可以将函数的签名更改为async Task,则可以使用这里提供的代码

我已经阅读了所有的解决方案,它真的很复杂…最简单的解决方案是返回bool类型:

async bool LoadBlahBlah()
{
    await blah();
    return true;
}

存储或检查返回值不是强制的。你可以这样做:

await LoadBlahBlah();

... 如果出错,你可以返回false。

您可以简单地将返回类型更改为Task并调用await Task。函数末尾的CompletedTask,例如:

async Task MyFunction() {
    await AnotherFunction();

    await Task.CompletedTask;
}

我发现这比将整个函数体包装在对task的调用中更简单。run(() =>{…});。

最佳实践是仅当函数是fire and forget方法时才将其标记为async void,如果你想等待,则应将其标记为async Task。

如果你仍然想等待,那么就像这样包装它。

做一个AutoResetEvent,调用函数,然后等待AutoResetEvent,然后在async void中设置它,当你知道它是完成的。

你也可以等待一个从void async返回的Task