我知道为什么会得到"致命错误:超出了执行时间限制"在这个代码的.NET小提琴?

时间:2016-12-11 18:23:16

标签: c# .net asynchronous async-await

我试图进行简单的测试

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();  
    }
}

我收到了错误

  

致命错误:超出了执行时间限制

知道为什么吗?

3 个答案:

答案 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每次运行都有以下限制:

  • 代码块大小 - 100K
  • 控制台输出尺寸-100K
  • 执行时间 - 5s
  • 内存 - 10MB
  • 磁盘空间 - 1MB

Source