Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Работа Threadpool c#

#c_sharp


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


Ответы

Ответ 1



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

Ответ 2



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

Комментариев нет:

Отправить комментарий