Подтвердить что ты не робот

Верно ли, что для длительных процессов лучше делать поток вручную вместо threadpool?

На днях я читал, что для длительных задач лучше всего вручную создавать потоки, а не использовать пул потоков .NET или Task Parallel. Мне бы очень хотелось, чтобы кто-то просветил меня, когда я узнал о потоке С#, особенно для длительных задач ввода-вывода. Заранее благодарю вас.

4b9b3361

Ответ 1

Это верно. Пул потоков оптимизирован для небольших единиц работы, и вы можете вмешиваться в другие работы, удерживая поток потока потока.

Мое правило: если операция может занимать больше секунды, она не должна быть в потоке пула потоков. Вероятно, это довольно долго.

Хотя это недокументировано, если вы запустите Task с помощью TaskCreationOptions.LongRunning, тогда будет запущен новый поток для запуска Задачи.

Для большинства задач ввода-вывода существуют асинхронные версии методов фреймворка, которые вы действительно должны использовать. Они используют функции ядра и означают, что вы не будете блокировать какой-либо поток.

Как всегда, я рекомендую читать бесплатную электронную книгу Joe Albahari, а затем Параллельное программирование Joe Duffy в Windows. Более поздняя версия - 1000 страниц, но полна полезных сведений.

Ответ 2

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

Очень хорошая статья в журнале MSDN: Выделенный поток или поток Threadpool?

Как только будет достигнуто минимальное количество потоков, пул потоков будет ограничьте количество потоков, созданных до одного за 500 миллисекунд. Это интеллектуальный механизм, позволяющий избежать дорогостоящих затрат создание нового потока, когда несколько потоков пулов потоков могут быть выпущенный в течение этого периода времени.

Так как .NET 4.0 - параллельная библиотека задач - это хорошая абстракция высокого уровня и альтернатива ручному управлению потоками и синхронизации, поэтому ваш код будет менее подвержен ошибкам. Так что просто создать задачу с TaskCreationOptions.LongRunning, я верю это было бы лучшими инвестициями в архитектуру приложений с точки зрения устойчивости.

Полезное чтение: