在我的程序中,我有~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秒。 如果我使用线程一切正常,线程立即启动。为什么?是什么原因?
答案 0 :(得分:10)
默认情况下,任务被安排到ThreadPool。在安排大量任务时,ThreadPool不会创建新线程。它会在创建新线程之前等待一段时间(基于一些启发式)。这就是为什么你注意到你的任务开始延迟的原因。 I've explained it earlier here
回到你的问题。如果您的任务长时间运行,您应该考虑使用LongRunning
标志。它将指示任务计划程序为其提供一个新线程;所以你的任务可以长时间独立运行而不会影响其他任务。
Task.Factory.StartNew(() =>
{
...
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);