根据你的例子
public async Task PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
- Logger.LogInfo同步调用
async
关键字给方法PushCallAsync
提供了等待的能力,但它从不等待任何东西
如果您的意图是让该方法异步运行 - 正如名称PushCallAsync
所暗示的那样,您必须找到一种替代方式来同步调用LogInfo。
如果存在一个LogInfoAsync
方法,并且试图避免使用await
是不明智的。等待非常重要,因为:
- 它捕获并抛出可能发生在任务执行过程中的异常 - 否则会丢失/未处理
- 它通过等待结果确保执行顺序
如果您特别想要fire-and-forget行为,即不依赖于执行顺序(例如,在此情况下不关心日志消息的顺序),则调用LogInfoAsync()
而不等待结果。
由于您没有使用任何await
,因此不需要将方法标记为async
。使其异步的不是async
关键字,而是调用其他方法的异步性。
public Task PushCallAsync(CallNotificationInfo callNotificationInfo)
{
_ = Logger.LogInfoAsync("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
Task.CompletedTask;
}
或非异步
public void PushCall(CallNotificationInfo callNotificationInfo)
{
_ = Logger.LogInfoAsync("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
不是说方法名字
Push暗示了它是有序的。所以如果你真的不在乎顺序,我会给它取一个不同的名字。否则,正如Push所暗示的那样,使用await确保顺序是正确的。
Task.Run
。async
/await
并不是真正的多线程机制,实际上我认为运行时会尽可能地在尽可能少的线程上执行任务。这主要是因为编译器会自动将你的代码转换为延续传递风格,所以只有在绝对必要时才需要等待后台操作的结果或完成。当你不需要等待(或await
)调用结果时,这不是你要寻找的语言特性。 - millimoose