Работа Threadpool c#

336
12 ноября 2017, 14:24

Здравствуйте, я сейчас занимаюсь изучением Threadpool в .net. Как я понял он состоит из уже заранее созданных рабочих потоков(их количество ограничено) и очереди задач(т.е обычных делегатов). Для каждого рабочего потока есть своя цепочка задач. Рабочий поток выполняет задачу и отпускает ее.
Так же я знаю мы можем на прямую добавить в Threadpool задачу (с помощью ThreadPool.QueueUserWorkItem()) и читал, что это на много быстрее чем Thread Start т.к создание потока происходит долго. На основе всего этого у меня есть пару вопросов:
1) Threedpool - это коллекция создается для каждого приложения отдельно т.е каждое приложением будет иметь свой собственный Threedpool или же он создается в контексте ядра операционной системы?
2) Если ThreadPool.QueueUserWorkItem() на много лучше чем Thread Start зачем его тогда вообще использовать, зачем его другие используют? Может я могу всегда пользоваться ThreadPool.QueueUserWorkItem()?

Answer 1

1) Потоки привязаны к процессу на уровне операционной системы. Это значит, каждое приложение имеет свой собственный ThreadPool со своими собственными потоками.

2) ThreadPool лучше тогда, когда вы не знаете сколько точно потоков у вас будет, и вам не нужно строго детерминированное поведение. Если к примеру у вас игра с графическим интерфейсом, и отрисовка идет в отдельном потоке, то его можно создать с помощью new Thread(), так как все преимущества ThreadPool неприменимы в таком случае.

Answer 2

По поводу второго вопроса, смотрите. Пул потоков — общий разделяемый ресурс всего приложения.

Если ваша задача — сравнительно короткая, то лучше выполнять её на пуле потоков, чтобы избежать расходов на создание нового потока.

Но если ваша задача длинная, то выигрыш от отсутствия создания нового потока уже не так велик, ведь задача-то всё равно бежит долго. Хуже того, с длинной задачей вы надолго забираете в своё пользование общий ресурс, что не так уж и хорошо. Таким образом, для длинных задач лучше использовать отдельный поток.

Ещё одна ситуация, при которой может понадобиться явное создание потока — apartment. Если ваш код пользуется COM-объектами, он, возможно, должен бежать в STA-потоке. А потоки из пула не являются STA-потоками (и вы не можете превратить поток из пула в STA-поток).

READ ALSO
Создание программы на unity для трейдинга C# [требует правки]

Создание программы на unity для трейдинга C# [требует правки]

Цель: создание программы для трейдинга которая будет оповещать о изменениях ценыНе смог найти как брать информацию о цене с сайта

297
c# накладывание фильтров на изображение

c# накладывание фильтров на изображение

Стоит задача накладывать на изображение различные фильтрыТ

289
Деление для BigInteger

Деление для BigInteger

Пишу собственный класс BigInteger, тк стандартный использовать нельзя, да и нужно реализовать только деление с остатком BigInteger на числа 2, 8, 16(для...

363
The input is not a valid Base-64 string as it contains a non-base 64 character

The input is not a valid Base-64 string as it contains a non-base 64 character

При отправке формы происходит ошибка(Даже, если не выбран файл)При отсутствии input type="file" ошибки не возникает

464