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

5
在我的程序中,我有大约40个正在运行的任务,如下所示:
private void StartTryReconnectTask() {
       TryReconnectCTKS = new CancellationTokenSource();
       TryReconnectTask = new Task(this.TryReconnect, TryReconnectCTKS.Token);
       TryReconnectTask.Start();
}

在TryReconnect()方法内部有一个无限循环,只有在任务被取消时才会停止。对我来说,这里一切都看起来很好。
然后我需要在按钮点击时启动一个非无限的任务:
private void ExecuteRepairCommand(object o) {
       Task.Run(() => {
         ...
       });
    }

启动这个新任务需要大约30/40秒的时间。 如果我使用线程,一切工作都很正常,线程会立即开始。为什么?原因是什么?


我认为这可能是异步问题或缺乏异步,我不认为它会在30-40秒后开始,那时它已经完成了。也许尝试将ExecuteRepairCommand更改为异步,并等待该任务。 - Henrik Bøgelund Lavstsen
创建任务时,请使用 TaskCreationOptions.LongRunning 标志。 - Sriram Sakthivel
@SriramSakthivel 哇,谢谢你! 你能发帖答案让我标为正确吗? - rmbq
1个回答

19

默认情况下,任务被安排在线程池中。当你安排了大量任务时,线程池不会创建新线程。它会等待一段时间再创建新的线程(根据某些启发式算法)。这就是为什么你注意到任务启动有延迟的原因。我先前在这里解释过

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接