29 c# task-parallel-library async-await c#-5.0
考虑在没有等待的情况下使用async.
想想也许你误解了异步的作用.警告是完全正确的:如果您将方法标记为异步但不在任何地方使用等待,那么您的方法将不是异步的.如果调用它,方法中的所有代码将同步执行.
我想编写一个应该运行异步但不需要使用await的方法.例如,当使用线程时
public async Task PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
Run Code Online (Sandbox Code Playgroud)
我想要调用PushCallAsync并运行异步,不想使用等待.
我可以在C#中使用async而无需等待吗?
Vis*_*ons 29
如果您Logger.LogInfo已经异步,这就足够了:
public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
Run Code Online (Sandbox Code Playgroud)
如果它不是在不等待它的情况下启动异步
public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId));
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 24
你仍然是误解async.该async关键字并不会意味着"另一个线程上运行".
要将一些代码推送到另一个线程,您需要明确地执行此操作,例如Task.Run:
await Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId));
Run Code Online (Sandbox Code Playgroud)
我有一个async/ await介绍帖子,你可能会发现有用.
你误会了async。实际上,它只是告诉编译器在后台为您传播控制流的反转。这样整个方法栈都被标记为异步。
您实际要做什么取决于您的问题。(让我们考虑您的调用Logger.LogInfo(..)是一个async方法,因为它最终会调用File.WriteAsync()左右。
Logger.LogInfo(..)进行操作,则必须采取预防措施。当您的方法以某种方式位于调用堆栈的中间时,就是这种情况。然后Logger.LogInfo(..)通常会返回Task,您可以等待。但是要小心调用task.Wait(),因为它将死锁您的GUI线程。而是使用await或返回Task(然后您可以忽略异步):public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
return Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId);
}Run Code Online (Sandbox Code Playgroud)
要么
public async void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
await Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59384 次 |
| 最近记录: |