线程未同时启动

时间:2019-02-27 14:41:03

标签: c# multithreading task

我知道有关此主题的问题很多,我已经审查了所有问题,却找不到可行的解决方案。

我正在WPF应用程序中同时启动10个线程。

前四个线程同时启动,但其他作业开始滞后大约5-10秒。我在下面共享测试数据。

我该如何解决这个问题?

private void DoParallel()
{
    for (int i = 0; i < 10; i++)
    {
         Task.Factory.StartNew(() =>
          {
            Console.WriteLine(DateTime.Now.ToString());
            DoSomeWork();
          });
        }
    }
}
  • 27.02.2019 17:31:33
  • 27.02.2019 17:31:33
  • 27.02.2019 17:31:33
  • 27.02.2019 17:31:33
  • 27.02.2019 17:31:35
  • 27.02.2019 17:31:40
  • 27.02.2019 17:31:46
  • 27.02.2019 17:31:52
  • 27.02.2019 17:32:00
  • 27.02.2019 17:32:02

1 个答案:

答案 0 :(得分:1)

这是设计使然。默认的TaskScheduler使用的是.NET ThreadPool,它可能已饱和,您对此的控制有限。

如果愿意,可以创建自己的TaskScheduler来更改此行为。例如,如果需要,您可以创建一个启动单独线程的线程。

如果您的代码触发的任务比已经执行的任务多,这种行为将变得更加明显:

private void DoParallel()
{
    //This will over-saturate the ThreadPool unless you use your own TaskScheduler
    for (int i = 0; i < 100; i++)
    {
         Task.Factory.StartNew(() =>
          {
            Console.WriteLine(DateTime.Now.ToString());
            DoSomeWork();
          });
        }
    }
}