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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中使用async而不等待?相关的知识,希望对你有一定的参考价值。

考虑一下Using async without await

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

我想编写一个应该运行异步但不需要使用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 intro 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) );

以上是关于在C#中使用async而不等待?的主要内容,如果未能解决你的问题,请参考以下文章

使用异步而不等待

主线程等待 std::async 完成[重复]

返回一个promise而不等待nodejs中函数中的依赖promise

启动进程并等待退出代码而不冻结

text 使用C#等待async而不是Unity coroutine

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题