你误会了async
。它实际上只是告诉编译器传播它在后台为您执行的控制流的反转。这样整个方法堆栈就被标记为异步。
你真正想要做什么取决于你的问题。(让我们认为您的调用Logger.LogInfo(..)
是一种async
方法,因为它最终会调用 File.WriteAsync() 左右。
- 如果你调用函数是一个 void 事件处理程序,你很好。异步调用将在一定程度上(即 File.WriteAsync)在后台发生。您不希望在您的控制流中有任何结果。那就是火,然后忘记。
- 但是,如果您想对结果做任何事情,或者如果您只想在那个时候继续,当
Logger.LogInfo(..)
完成时,您必须采取预防措施。当您的方法以某种方式位于调用堆栈的中间时,就是这种情况。然后Logger.LogInfo(..)
通常会返回一个Task
并且您可以等待。但要小心调用 task.Wait() 因为它会死锁你的 GUI 线程。而是使用等待或返回任务(然后您可以省略异步):
public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
return Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId);
}
或者
public async void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
await Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId);
}