Почему иногда Задача значительно медленнее, чем Поток? - PullRequest
4 голосов
/ 10 июля 2011

Я делаю приложение WPF, используя шаблон MVVM. Я обнаружил, что иногда Задача значительно медленнее, чем Thread. Например, в тесте ViewModel:

public void DoSomething()
{
    Stopwatch stopwatch = Stopwatch.StartNew();
    new Thread(() =>
        {
            Debug.Print(string.Format("Elapsed: {0}", stopwatch.ElapsedMilliseconds));
        }).Start();
}

Выход обычно составляет Elapsed: 0. Это стоило 0 миллисекунд. Но если я заменю Thread на Task. Это может стоить 5000 ~ 15000 миллисекунд.

Я пытался воспроизвести это в другом проекте WPF, но не смог.

Конфигурации моей системы:

  • Visual Studio 2010 SP1
  • .NET Framework 4.0
  • Windows 7 64bit.
  • 4 ГБ ОЗУ
  • AMD Phenom II 635 (4 ядра, 2,9 ГГц)

Есть идеи? Спасибо.

(Извините, я не могу загрузить проект с такой проблемой)

1 Ответ

13 голосов
/ 10 июля 2011

По умолчанию Task не создает новый поток, но ставит в очередь в пуле потоков. Это означает, что когда все потоки пула потоков заняты, задача может ждать (в крайних случаях бесконечно долго), пока она фактически не начнет выполняться.

Пул потоков пытается определить оптимальное количество потоков и создает как минимум один поток на ядро. Вы можете использовать ThreadPool.SetMinThreads() для увеличения минимального количества используемых потоков, но будьте осторожны с этим, это может снизить производительность.

Другой вариант - создать свой собственный TaskScheduler, который использует потоки именно так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...