【问题标题】:Task.Run takes much time to start the taskTask.Run 需要很长时间才能启动任务
【发布时间】:2016-10-12 09:16:20
【问题描述】:

在我的程序中,我有大约 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 异步,然后等待任务。
  • 创建任务时使用TaskCreationOptions.LongRunning标志。
  • @SriramSakthivel 哇,谢谢!你能把答案贴出来让我把它标记为正确吗?

标签: c# wpf multithreading performance task


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多