为何await未启动的Task变量会导致程序冻结?
问题原因及解决办法
你写的代码之所以卡住,核心问题是:用new Task(...)创建的任务根本没启动。
new Task()只是生成了一个任务对象,但这个任务处于「未启动(Created)」状态。await的逻辑是等待任务执行完成,可任务连开始都没开始,程序自然会一直卡在await myTask这行,永远等不到后续的"Finish"输出。
两种修复方式
方式一:手动启动任务
给创建好的Task调用Start()方法,触发任务执行:
static async Task Main(string[] args) { Console.WriteLine("Start"); Task myTask = new Task(() => { Console.WriteLine("Done"); }); myTask.Start(); // 手动启动任务 await myTask; Console.WriteLine("Finish"); }
方式二:用Task.Run()直接创建并启动任务
这是异步编程里更常用的写法,Task.Run()会自动把任务放到线程池队列,无需手动启动:
static async Task Main(string[] args) { Console.WriteLine("Start"); Task myTask = Task.Run(() => { Console.WriteLine("Done"); }); await myTask; Console.WriteLine("Finish"); }
额外提醒
new Task()这种方式一般只在需要精确控制任务启动时机的场景下使用,日常异步编程优先用Task.Run(),能避免这种「创建了任务却忘了启动」的低级错误。
内容的提问来源于stack exchange,提问作者Alexanr
相关产品推荐
相关产品推荐

