在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)); }
你仍然误解了async
。 async
关键字并不意味着“在另一个线程上运行”。
要将一些代码推送到另一个线程,您需要明确地执行它,例如, 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) );