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
相关产品推荐
相关产品推荐

