簡體   English   中英

C# await之后代碼會繼續執行嗎?

[英]C# Will code execution continue after await?

在閱讀了大量有關 await/async 的資料后,我對這個主題仍然存在一些誤解。 請對我的問題提供一個簡短的回答(是/否)和一個長的回答,以便我更好地理解。

假設我們有以下方法:

public async Task UnresultTaskMethod()
{
   await AsyncMethod1();
   await AsyncMethod2();
}

問題:

  1. 當代碼的執行將到達AsyncMethod1時,它會在執行 AsyncMethod1() 時自動移動到調用 AsyncMethod2 嗎?
  2. 當代碼執行到AsyncMethod2時,在AsyncMethod2執行完全結束之前,該方法的執行是否結束,並返回到調用方?
  3. 是否存在這樣的情況,方法的執行將在對異步方法的調用完全完成之前結束(例如,該方法是無效的而不是任務)?
  4. 當我需要放置Task.WaitAll(tasks); Task.WhenAll(tasks); Task.WaitAll(tasks); Task.WhenAll(tasks); 最后,我可以確保在所有任務結束之前不會繼續執行,這是我感到困惑的主要因素,如果可以通過關鍵字 await 等待它們,為什么還要以這種方式等待任務?
  5. 我在想什么時候執行會碰到帶await的async方法,會放到processing schedule上,繼續執行function里面的代碼,感覺理解錯了。

await 大致意思是“等到完成”

  1. 如果你不等待,它可能是這種情況,例如

public async Task UnresultTaskMethod()
{
   Task.Delay(2000);

   // We haven't awaited, so we're here right away
   await AsyncMethod2();
}
  1. 當您立即等待單個任務時, Task.WaitAllTask.WhenAll沒有意義。 但是,您可以這樣做:
public async Task UnresultTaskMethod()
{ 
   var task1 = AsyncMethod1();
   var task2 = AsyncMethod2();

   // The tasks are now doing their job

   await Task.WhenAll(task1, task2);
 
   // Here you are sure both task1 and task2 are completed
}

使用Task.WaitAll它將是這樣的:

public async Task UnresultTaskMethod()
{ 
   var task1 = AsyncMethod1();
   var task2 = AsyncMethod2();

   // This is not awaitable, you're blocking the current thread
   Task.WaitAll(task1, task2);
 
   // Here you are sure both task1 and task2 are completed
}

在這種情況下,您不需要async Task ,因為您沒有等待,即它實際上是一個void方法。

  1. 希望現在更清楚了

暫無
暫無

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

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