在C#中使用async而不等待?

考虑在没有等待的情况下使用async 。

想想也许你误解了异步的作用。 警告是完全正确的:如果您将方法标记为异步但不在任何地方使用等待,那么您的方法将不是异步的。 如果你调用它,方法中的所有代码将同步执行。

我想编写一个应该运行异步但不需要使用await的方法。例如在使用线程时

public async Task PushCallAsync(CallNotificationInfo callNotificationInfo) { Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId, } 

我想调用PushCallAsync并运行异步,不想使用等待。

我可以在C#中使用async而不等待吗?

如果您的Logger.LogInfo已经是异步,这就足够了:

 public void PushCallAsync(CallNotificationInfo callNotificationInfo) { Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId, } 

如果它不是在不等待它的情况下启动异步

 public void PushCallAsync(CallNotificationInfo callNotificationInfo) { Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId)); } 

你仍然误解了asyncasync关键字并不意味着“在另一个线程上运行”。

要将一些代码推送到另一个线程,您需要明确地执行它,例如, Task.Run

 await Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId)); 

我有一个你可能会觉得有用的async / await介绍post 。

你误解了async 。 它实际上只是告诉编译器传播它在后台为你做的控制流的反转。 这样整个方法堆栈就被标记为异步。

你真正想做的事情取决于你的问题。 (让我们考虑你的调用Logger.LogInfo(..)是一个async方法,因为它最终调用File.WriteAsync()左右。

  • 如果你调用function是一个void事件处理程序,那你很好。 异步调用将在某种程度上(即File.WriteAsync)在后台发生。 您不希望控制流中出现任何结果。 那是火与忘记。
  • 但是,如果您想对结果执行任何操作,或者如果您只想继续,那么当Logger.LogInfo(..)完成时,您必须采取预防措施。 当您的方法以某种方式位于调用堆栈的中间时就是这种情况。 然后Logger.LogInfo(..)通常会返回一个Task ,你可以等待。 但要注意调用task.Wait(),因为它将死锁你的GUI-Thread。 而是使用等待或返回任务(然后你可以省略异步):

 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); } 

如果Logger.LogInfo是同步方法,则整个调用仍将是同步的。 如果您只想在单独的线程中执行代码,则async不是作业的工具。 请尝试使用线程池:

 ThreadPool.QueueUserWorkItem( foo => PushCallAsync(callNotificationInfo) );