[英]Any idea why I am getting “Fatal Error: Execution time limit was exceeded” on .NET fiddle for this code?
我正在尝试进行简单的测试
using System;
using System.Threading.Tasks;
public class Program
{
public static Task DelayAndThenPrint(int mills)
{
return new Task(() =>
{
Task.Delay(mills);
Console.WriteLine(string.Format("Delayed {0} milliseconds and then reached here", mills));
});
}
public static void Main()
{
Task.Run(async () =>
{
await DelayAndThenPrint(200);
Console.WriteLine("hey!");
await DelayAndThenPrint(100);
}).Wait();
}
}
并得到错误
严重错误:超过了执行时间限制
知道为什么吗?
您做错了几件事:
Task.Delay(mills)
不延迟; 它返回一个将延迟的Task
。 您需要等待该任务完成才能真正获得延迟。 目前,您将体验到几乎为零的延迟。
new Task()
是创建冷 Task
的几种方法之一。 即它没有运行。 等待冷任务时,它将等待直到任务完成或抛出; 即永远。 为什么不开始,一定是设计决定,但是产生了IL。 例如, 这里似乎证实了这一点。 你需要与第一启动任务.Start()
或,而不是返回new Task()
使用Task.Run()
来创建一个热 (运行)的任务。
更好的是,将您的方法简化为:
public static async Task DelayAndThenPrint(int mills)
{
await Task.Delay(mills).ConfigureAwait(false);
Console.WriteLine(string.Format("Delayed {0} milliseconds and then reached here", mills));
}
除了sellotape的答案外 ,您还没有正确使用等待/异步。 DelayAndThenPrint
不是异步的,所以等待它实际上什么也没做。 您正在寻找的是:
public static async Task DelayAndThenPrint(int mills)
{
return await Task.Run(async () =>
{
await Task.Delay(mills);
Console.WriteLine(string.Format("Delayed {0} milliseconds and then reached here", mills));
});
}
public static void Main()
{
Task.Run(async () =>
{
await DelayAndThenPrint(200);
Console.WriteLine("hey!");
await DelayAndThenPrint(100);
}).Wait();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.