簡體   English   中英

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

[英]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()左右。

  • 如果你調用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) );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM