You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:25:35