在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));
}
你仍然误解async
。 async
关键字并不意味着“在另一个线程上运行”。
要将一些代码推送到另一个线程,您需要明确地执行此操作,例如,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而不等待?的主要内容,如果未能解决你的问题,请参考以下文章
返回一个promise而不等待nodejs中函数中的依赖promise