直接从 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中文网其他相关文章!