Каково различие между использованием пула потоков и нормальным потоком?

Не существует подхода «один размер подходит всем» к развитию

Я удивлен, что это противоречивое мнение, потому что оно мне кажется здравым смыслом. Однако в популярных блогах есть много статей, пропагандирующих подход «один размер подходит всем», поэтому я думаю, что на самом деле я в меньшинстве.

Вещи, которые я видел, как правильный подход для любого проекта - до того, как станет известна какая-либо информация о нем - это такие вещи, как использование Test Driven Development (TDD) Проектирование, управляемое доменом (DDD), объектно-реляционное сопоставление (ORM), Agile (заглавная A), объектная ориентация (OO) и т. Д. И т. Д., Охватывающее все - от методологий до архитектур и компонентов. Конечно, с хорошими товарными сокращениями.

Люди даже заходят так далеко, что размещают значки в своих блогах, такие как «Я тест-драйв» или аналогичные, как будто их строгое соблюдение единого подхода, какими бы ни были детали проекта проекта, на самом деле хорошая вещь .

Это не так.

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

15
задан Community 23 May 2017 в 12:16
поделиться

4 ответа

The threadpool is typically suitable for short running tasks. It has the limitation that it is a application-wide limited resource (25 per CPU), and there are a lot of internal classes that use the threadpoool, so if you perform a lot of long running tasks you will use up all the threads.

For long running tasks, it's better to use a manually created thread, with its background property set to true.

Note: In the .NET Framework version 2.0, the Thread.CurrentPrincipal property value is propagated to worker threads queued using the QueueUserWorkItem method. In earlier versions, the principal information is not propagated.

When Not to Use Thread Pool Threads

There are several scenarios in which it is appropriate to create and manage your own threads instead of using thread pool threads:

  • You require a foreground thread(!).

  • You require a thread to have a particular priority.

  • You have tasks that cause the thread to block for long periods of time. The thread pool has a maximum number of threads, so a large number of blocked thread pool threads might prevent tasks from starting.

  • You need to place threads into a single-threaded apartment. All ThreadPool threads are in the multithreaded apartment.

  • You need to have a stable identity associated with the thread, or to dedicate a thread to a task.

One big difference is that Unhandled exceptions on thread pool threads terminate the process; with these three exceptions:

  • A ThreadAbortException is thrown in a thread pool thread, because Abort was called.

  • An AppDomainUnloadedException is thrown in a thread pool thread, because the application domain is being unloaded.

  • The common language runtime or a host process terminates the thread.

Some good references are:

The Managed Thread Pool

Threading in C#

Programming the Thread Pool in the .NET Framework

Update: in response to comments. You can use the GetAvailableThreads method to determine the actual number of threads in the thread pool at any given time. ThreadPool.GetMaxThreads is a different quantity. Its the max allowed in the pool before requests are queued, not the actual number of threads currently in the pool.

21
ответ дан 1 December 2019 в 02:02
поделиться

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

Пул потоков в .net - это пул потоков, который будет увеличиваться или уменьшаться. Когда вы ставите что-то в очередь для обработки пула потоков, он определит, нужно ли ему запускать новый поток или будет повторно использовать существующий. Вам не нужно явно создавать потоки.

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

См. эту статью о пуле потоков

7
ответ дан 1 December 2019 в 02:02
поделиться

ThreadPool содержит ряд потоков, готовых к использованию, что может снизить затраты на создание новых потоков, что происходит при создании обычного потока.

3
ответ дан 1 December 2019 в 02:02
поделиться

Пул потоков создает потоки и назначает работу свободному потоку. Таким образом предотвращается создание и удаление потоков для каждого рабочего элемента, поскольку создание и удаление потоков является относительно дорогостоящей операцией.

0
ответ дан 1 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: