Я повторил эксперименты CodeProject article on this topic и нашел результаты для .NET 4 похожими на то, что было описано в 2003 году. Обратите внимание, что в статье фактически не перечислены результаты для проблемного раздела, но, как я понимаю, основной вопрос все еще существует.
Я повторно использовал код из статьи CodeProject - просто загрузите его, чтобы запустить этот тест самостоятельно или поэкспериментировать.
Тест попытается использовать 10 параллельных потоков, чтобы считать, насколько это возможно, через 1 секунду.
Использования 10 фоновых нитей (т.е. new Thread()
)
T0 = 4451756
T1 = 4215159
T2 = 5449189
T3 = 6244135
T4 = 3297895
T5 = 5302370
T6 = 5256763
T7 = 3779166
T8 = 6309599
T9 = 6236041
Total = 50542073
Использования 10 Threadpool рабочих элементов
T0 = 23335890
T1 = 20998989
T2 = 22920781
T3 = 9802624
T4 = 0
T5 = 0
T6 = 0
T7 = 0
T8 = 0
T9 = 0
Total = 77058284
Обратите внимание, что только 4 нити элементы бассейна работы из 10 когда-либо фактически исполненных во время 1-секундного среза! Это на четырехъядерном процессоре, так что это был один поток на ядро.Другие задачи, выполненные после первых четырех завершенных, и поскольку уже выделенные 1 секунда истекли, они не увеличивали свои счетчики.
Заключение здесь: с длинными задачами, ThreadPool заставит некоторые задачи ждать других! Таким образом, я настоятельно рекомендую не выполнять длительную обработку в задачах ThreadPool (например, асинхронные обработчики завершения). В противном случае, вы можете сохранить более важные асинхронные вызовы, если ваша обработка данных забивает процессор, или вы можете иметь очень нестабильную производительность, если только некоторые задачи выполняют большую обработку.
Использование пользовательской реализации ThreadPool из статьи
T0 = 7175934
T1 = 6983639
T2 = 5306292
T3 = 5078502
T4 = 3279956
T5 = 8116320
T6 = 3262403
T7 = 7678457
T8 = 8946761
T9 = 8500619
Total = 64328883
Я хотел бы призвать вас взглянуть на Rx (Реактивные расширения), что делает асинхронное программирование красивой вечернюю прогулку в парке! http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx – gideon
Некоторые полезные ссылки Rx: http://rxwiki.wikidot.com/ Вот небольшой код, который я написал для асинхронного обновления списка каждый раз, когда я печатаю в текстовом поле, и запустите его на 0,5 секунды. См .-> http://stackoverflow.com/questions/4655619/simple-rx-code-silently-fails-in-windows-forms-only-during-debugging-in-visual-st – gideon