直接從Main 呼叫非同步方法:綜合指南
C# 中引入的重要增強功能之一是async/await 模式,它簡化了異步操作的開發。然而,直接從 Main() 呼叫非同步方法可能有點棘手。
要理解這個問題,請考慮以下程式碼範例:
public class test { public async Task Go() { await PrintAnswerToLife(); Console.WriteLine("done"); } public async Task PrintAnswerToLife() { int answer = await GetAnswerToLife(); Console.WriteLine(answer); } public async Task<int> GetAnswerToLife() { await Task.Delay(5000); int answer = 21 * 2; return answer; } }
如果您嘗試呼叫Go 方法從Main() 開始,如下所示:
class Program { static void Main(string[] args) { test t = new test(); t.Go().GetAwaiter().OnCompleted(() => { Console.WriteLine("finished"); }); Console.ReadKey(); } }
您可能會遇到死鎖情況,從而阻止任何輸出出現在screen.
解決方案在於將Main()修改為異步方法本身。對於從 7.1 開始的 C# 版本:
static async Task Main(string[] args) { test t = new test(); await t.Go(); Console.WriteLine("finished"); Console.ReadKey(); }
此方法允許非同步操作無縫運行,而不會阻塞主執行緒。
如果您使用的是早期版本的C# ,可以使用下面的程式碼:
static void Main(string[] args) { test t = new test(); t.Go().Wait(); Console.WriteLine("finished"); Console.ReadKey(); }
這裡,Wait()方法明確阻塞主線程,直到Go方法
請記住,透過採用非同步/等待模式,您可以避免回呼的複雜性,從而為非同步操作提供更乾淨、更易於維護的程式碼。
以上是如何在C#的Main方法中正確呼叫非同步方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!