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

rmb*_*mbq 1 c# wpf performance multithreading task

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

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

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

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

private void ExecuteRepairCommand(object o) {
       Task.Run(() => {
         ...
       });
    }
Run Code Online (Sandbox Code Playgroud)

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

Sri*_*vel 12

默认情况下,任务被安排到ThreadPool.在安排大量任务时,ThreadPool不会创建新线程.它会在创建新线程之前等待一段时间(基于一些启发式).这就是为什么你注意到你的任务开始延迟的原因.我早些时候在这里解释过.

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

Task.Factory.StartNew(() =>
{
    ...
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); 
Run Code Online (Sandbox Code Playgroud)