@Dan Dinu 對先前關于 C# 異步編程的問題的回答提供了一個有用的最小示例,我對其進行了如下調整:
// From https://stackoverflow.com/questions/14455293/how-and-when-to-use-async-and-await
using System;
using System.Threading.Tasks;
namespace minimal_async_await_SE
{
internal class Program
{
public static async Task MyMethodAsync()
{
Task<int> longRunningTask = LongRunningOperationAsync();
// independent work which doesn't need the result of LongRunningOperationAsync
// can be done here
Console.WriteLine("Independent work");
//Call await on the task
int result = await longRunningTask;
Console.WriteLine(result);
}
public static async Task<int> LongRunningOperationAsync()
{
await Task.Delay(1000);
return 1;
}
static void Main(string[] args)
{
MyMethodAsync();
Console.WriteLine("Returned to Main");
//Console.ReadKey();
}
}
}
如果我取消注釋第 32 行,我會得到以下預期結果:
Independent work
Returned to Main
1
基本上:
Main來電MyMethodAsyncMyMethodAsync來電LongRunningOperationAsyncLongRunningOperationAsync然后呼叫Task.Delay,但await它暫停了對封閉方法的進一步評估LongRunningOperationAsync,將控制權回傳給呼叫者,即MyMethodAsync.MyMethodAsync列印出來"Independent work"。MyMethodAsync嘗試分配結果的LongRunningOperation to結果butawaits it, suspends evaluation of the enclosingMyMethodAsync, and returns control of the program back toMain`Main列印出來"Returned to Main"Task.Delay(1000)在LongRunningOperationAsync()完成- 產生了一個新執行緒,在
LongRunningOperationAsync(MyMethodAsync) 的呼叫者中,整數1被分配給result。 - 評估
MyMethodAsync完成,并MyMethodAsync列印出價值result - 控制權交還給
Main,它會暫停評估,直到用戶通過Console.ReadKey
首先,我對這個程式如何評估的理解是否正確?其次,為什么當我發表評論時Console.ReadKey,會得到以下意外結果?
Independent work
Returned to Main
Main在退出程式之前,該方法是否不等待所有執行緒得到評估?為什么或者為什么不?
uj5u.com熱心網友回復:
您的問題“為什么或為什么不?”的答案 很復雜,但可以通過更好地理解 a 來回答Task。
ATask不是執行緒。許多任務可以在單個執行緒上運行,單個任務可以在多個執行緒上運行。
任務更像是一個事件,它將觸發調度程式在當時可用的任何執行緒上運行一些代碼(忽略一些復雜的延續問題)
因此,您的問題可以重新表述為“為什么我的程式不監聽所有事件并阻止執行,直到所有事件都被觸發?”。這個問題的答案可能讓 TPL(任務)的 1 或 2 位設計者徹夜難眠,最終他們認為這一決定的影響可能會對其他型別的應用程式造成嚴重損害
TPL 的設計者確實為我們提供了一種解決方法(后來的幾個 C# 版本),即異步 Main 方法。在您的情況下,它看起來像這樣:
static async Task Main(string[] args)
{
await MyMethodAsync();
Console.WriteLine("Returned to Main");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480678.html
