在 Main 中呼叫非同步方法
在 C# 中,可以使用非同步程式設計以非阻塞的方式執行操作。非同步方法允許任務與其他程式碼同時運行,從而釋放執行緒來處理其他任務。但是,當從 Main 方法呼叫非同步方法時(該方法本身不是非同步方法),我們需要進行一些調整,讓 Main 方法等待非同步操作完成。
使用 Async Main 方法(C# 7.1 及更高版本)
從 C# 7.1 開始,Main 方法可以修改為async,允許直接使用await運算子。這允許 Main 方法充當非同步操作的入口點。例如:
static async Task Main(string[] args) { test t = new test(); await t.Go(); Console.WriteLine("finished"); Console.ReadKey(); }
使用阻塞等待方法(早期 C# 版本)
對於早期版本的 C#,Main 方法不能宣告為非同步。相反,await 運算子不能直接使用。我們需要使用 Wait 方法手動等待非同步操作完成。例如:
static void Main(string[] args) { test t = new test(); t.Go().Wait(); Console.WriteLine("finished"); Console.ReadKey(); }
避免死鎖
問題中提供的範例嘗試使用 GetAwaiter.OnCompleted 來處理 Go 任務的完成。但是,這可能會導致死鎖,因為它嘗試在已同步的上下文上執行同步延續。透過將 Main 方法修改為非同步或使用上面提到的 Wait 方法,我們可以避免此問題並允許非同步操作正常完成。
以上是如何在C#的Main方法中正確等待非同步方法呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!