如何在C#中正确使用Task.Delay()?求助解决未等待错误及输出异常
问题原因与解决方案
嗨,我来帮你搞定这个问题~
你遇到的核心问题是在同步的Main方法里调用了异步方法,却没有等待它执行完成。编译器的警告其实已经点出了关键:你调用Delay()后没有用await或者Wait()来等待任务结束,所以Main方法会直接继续执行到末尾,程序就提前退出了,自然看不到每秒打印数字的效果。
下面给你两种可行的解决方案:
方案1:使用异步Main方法(推荐,C# 7.1+支持)
从C# 7.1开始,我们可以把Main方法声明为async Task,这样就能直接用await等待异步任务完成,这是最符合异步编程规范的做法:
static public async Task Main(string[] args) { await Delay(); } static async Task Delay() { for (int i = 0; i < 5; i++) { Console.WriteLine(i); await Task.Delay(1000); } }
方案2:阻塞等待任务完成(兼容低版本C#)
如果你的项目不能使用异步Main,可以在Main里调用Wait()方法,让主线程阻塞直到Delay()任务执行完毕:
static public void Main(string[] args) { Delay().Wait(); } static async Task Delay() { for (int i = 0; i < 5; i++) { Console.WriteLine(i); await Task.Delay(1000); } }
注意:
Wait()在控制台程序里不会有太大问题,但在UI程序或ASP.NET等场景下可能导致死锁,所以优先推荐方案1。
这样修改后,程序就会按预期每秒打印一个数字,直到循环执行完毕才会退出。
内容的提问来源于stack exchange,提问作者Lost
相关产品推荐
相关产品推荐

