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

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

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

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


当前回答

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

其他回答

最好的解决方案是使用async Task。你应该避免异步void有几个原因,其中之一是可组合性。

如果该方法不能返回Task(例如,它是一个事件处理程序),那么您可以在方法即将退出时使用SemaphoreSlim来获得方法信号。考虑在finally块中执行此操作。

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

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

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

await LoadBlahBlah();

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

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

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

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

你实际上不需要手动做任何事情,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