的任务.Run需要很长时间来启动任务

本文关键字:任务 长时间 启动 Run | 更新日期: 2023-09-27 18:12:37

在我的程序中,我有大约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秒。如果我使用线程,一切正常工作,线程立即启动。为什么?原因是什么?

的任务.Run需要很长时间来启动任务

默认情况下,任务被调度到ThreadPool。当您调度大量任务时,ThreadPool不会创建新线程。在创建新线程之前,它将等待一段时间(基于一些启发式方法)。这就是为什么你注意到你的任务开始延迟的原因。

回到你的问题。如果您的任务是长时间运行的,您应该考虑使用LongRunning标志。它将指示任务调度程序给它一个新线程;因此,您的任务可以独立运行很长一段时间,而不会影响其他任务。

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