繁体   English   中英

知道为什么我在此代码的.NET小提琴上收到“致命错误:超出执行时间限制”吗?

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

您可能会遇到.Net Fiddle的沙箱限制,当前,沙箱每次运行都有以下限制:

  • 代码块大小-100K
  • 控制台输出大小-100K
  • 执行时间-5s
  • 记忆体-10MB
  • 磁盘空间-1MB

来源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM