[英]Using async without await in C#?
考慮在沒有等待的情況下使用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
簡介帖子 ,你可能會覺得有幫助。
你誤解了async
。 它實際上只是告訴編譯器傳播它在后台為你做的控制流的反轉。 這樣整個方法堆棧就被標記為異步。
你真正想做的事情取決於你的問題。 (讓我們考慮你的調用Logger.LogInfo(..)
是一個async
方法,因為它最終調用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) );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.