C#中Async/Await未按预期运行,程序提前终止问题排查
问题分析与解决
你的代码核心问题是程序入口Main方法调用异步方法Method1时没有等待其执行完成。由于Main是同步方法,调用Method1()后会直接执行后续逻辑(此处无后续代码),主线程随即退出,所有未完成的异步任务会被强制终止,导致Method2还没开始执行程序就结束了。
解决方案
从C# 7.1开始,Main方法支持异步写法,直接将其改为异步并等待Method1完成即可:
static async Task Main(string[] args) { await Method1(); } static int Method2(int x) { for (int i = 0; i < 10; i++) { x += 1; Console.WriteLine(x); Thread.Sleep(200); } Console.WriteLine("final" + " " + x + " " + Thread.CurrentThread.ManagedThreadId); return x; } static async Task Method1() { Console.WriteLine("1 running"); int result1 = await Task.Run(() => Method2(0)); int result2 = await Task.Run(() => Method2(result1)); Thread.Sleep(1000); Console.WriteLine("result " + result2 * 2); }
兼容旧版本的替代方案
如果你的项目不支持C# 7.1及以上版本,可以在同步Main方法中阻塞等待异步任务完成(不推荐,但可临时解决问题):
static void Main(string[] args) { Method1().Wait(); // 或者 Method1().GetAwaiter().GetResult(); }
内容的提问来源于stack exchange,提问作者mhtaaghi
相关产品推荐
相关产品推荐

