我试图进行简单的测试
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();
}
}
我收到了错误
致命错误:超出了执行时间限制
知道为什么吗?
答案 0 :(得分:2)
你做错了几件事:
Task.Delay(mills)
不延迟;它会返回Task
,会延迟。您需要等待该任务完成以实际获得延迟。目前,您将遇到几乎零延迟。
new Task()
是创建冷 Task
的几种方法之一。即它没有运行。等待冷任务时,它会等到任务完成或抛出;即永远。为什么它没有启动它必须是一个设计决定,但IL生成;例如here似乎证实了这一点。您需要先使用.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));
}
答案 1 :(得分:0)
除了sellotape's answer之外,您还没有正确使用await / async。 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();
}
答案 2 :(得分:-2)
您可能会遇到.Net Fiddle的Sandbox限制 目前Sandbox每次运行都有以下限制:
(Source)