Task.Run需要很长时间才能启动任务

时间:2016-10-12 09:16:21

标签: c# wpf multithreading performance task

在我的程序中,我有~40个运行任务,定义如下:

private void StartTryReconnectTask() {
       TryReconnectCTKS = new CancellationTokenSource();
       TryReconnectTask = new Task(this.TryReconnect, TryReconnectCTKS.Token);
       TryReconnectTask.Start();
}

在TryReconnect()内部,有一个无限的while循环,只有在取消任务时才会停止。这里的一切似乎都很好。

然后我需要在点击按钮上启动任务(不是无限):

private void ExecuteRepairCommand(object o) {
       Task.Run(() => {
         ...
       });
    }

启动这项新任务需要约30/40秒。 如果我使用线程一切正常,线程立即启动。为什么?是什么原因?

1 个答案:

答案 0 :(得分:10)

默认情况下,任务被安排到ThreadPool。在安排大量任务时,ThreadPool不会创建新线程。它会在创建新线程之前等待一段时间(基于一些启发式)。这就是为什么你注意到你的任务开始延迟的原因。 I've explained it earlier here

回到你的问题。如果您的任务长时间运行,您应该考虑使用LongRunning标志。它将指示任务计划程序为其提供一个新线程;所以你的任务可以长时间独立运行而不会影响其他任务。

Task.Factory.StartNew(() =>
{
    ...
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);