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

Task.Delay未生效问题:异步任务无预期延迟的技术咨询

问题原因及解决办法

原因

LoopA和LoopB里的Task.Delay只是创建了一个延迟任务,但没有等待它执行完成——既没加await,也没调用.Wait()。这导致延迟任务刚启动,方法就直接执行return语句返回结果了,所以Task.Run包装的这两个任务会瞬间完成,程序自然立刻打印拼接后的结果。

解决办法

推荐用异步编程的标准方式修改,让延迟真正生效:

方法一:将LoopA和LoopB改为异步方法(推荐)

修改方法签名为async Task<string>,并使用await等待延迟完成:

private static async Task Main()
{
    Console.Clear();
    Console.WriteLine("start");
    await MyMethodAsync();
}

private static async Task MyMethodAsync()
{
    const int count = 10;
    Task<string> loopATask = LoopA(count); // 这里无需Task.Run,async方法直接返回Task
    Task<string> loopBTask = LoopB(count);
    string resultA = await loopATask;
    string resultB = await loopBTask;
    Console.WriteLine(resultA + resultB);
}

public static async Task<string> LoopA(int count)
{
    await Task.Delay(2000);
    return "LoopA has finished ";
}

public static async Task<string> LoopB(int count)
{
    await Task.Delay(1000);
    return "LoopB has finished ";
}

两个延迟任务会异步执行,LoopA的2秒延迟是最长的,程序会等待2秒后打印结果,符合预期。

方法二:阻塞等待延迟完成(不推荐)

如果不想修改方法为异步,可以调用.Wait()强制阻塞线程等待延迟结束,但这种方式会浪费线程资源,不符合异步编程的设计初衷:

public static string LoopA(int count)
{
    Task.Delay(2000).Wait();
    return "LoopA has finished ";
}

public static string LoopB(int count)
{
    Task.Delay(1000).Wait();
    return "LoopB has finished ";
}

内容的提问来源于stack exchange,提问作者electro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:10:50