Task.Run 不同的第二次执行

Task.Run different second execute

我是 C# 新手。

问题:

class Program
{
    static void why()
    {
        List<Task> listOfDummyTask = new List<Task>();
        for (int i = 0; i < 100; ++i)
        {
            Task hoho = Task.Run(() =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("Die");
            });
            listOfDummyTask.Add(hoho);
        }
        Task.WaitAll(listOfDummyTask.ToArray());
    }

    static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();

        sw.Reset();
        sw.Start();
        why();
        sw.Stop();
        Console.WriteLine("{0} ms", sw.ElapsedMilliseconds.ToString());
        Console.WriteLine("----------------------------------");

        sw.Reset();
        sw.Start();
        why();
        sw.Stop();
        Console.WriteLine("{0} ms", sw.ElapsedMilliseconds.ToString());
        Console.WriteLine("----------------------------------");

        Console.WriteLine("End");
    }
}

首先,我调用 why(),它打印 "Die" 相同的 4 次。

并打印 1 ~ 4 "Die"。

第一个 why() 秒表 returns 28,000 毫秒,但是当我调用第二个 why() 时,

打印"Die" 8次,同时打印5~8 "Die"..

第二个 why() 秒表 returns 10,000 ~ 14,000 毫秒。

为什么?

关键字是什么情况?

Task.Run 循环 100 次会将 100 个工作项排入默认调度程序(线程池)。如果线程池决定同时执行最多 4 个项目,那么它将从队列中取出 4 个工作项目并在大约 2 秒内完成它们。然后还需要四个,以此类推,直到全部完成。

没有真正期望有多少任务会并发执行,有多少任务会被推迟。