Могу ли я разделить C # System.Threading.ThreadPool? - PullRequest
5 голосов
/ 15 февраля 2011

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

Моя основная проблема заключается в том, что у меня есть несколько разных библиотек, которые все используют пул потоков несогласованным образом, и возможно исчерпание потоков. Я надеялся, что есть какой-то способ разделить ThreadPool таким образом, чтобы я мог создать определенный поток класса 1, еще 20 потоков, еще 5 потоков и т. Д.

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

В настоящее время я вынужден использовать 3.5 CLR. Я знаю, что многое из этого становится легче в 4.0.

Ответы [ 3 ]

3 голосов
/ 15 февраля 2011

Нет, к сожалению, нет. Это одна из моих ошибок с пулом потоков .NET. Даже в .NET 4 с Parallel Extensions он, как правило, основан на едином системном пуле потоков - вам придется проделать определенную работу, чтобы создать свои собственные отдельные пулы потоков (и передать их в задачи как планировщик задач или что-то подобное).

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

0 голосов
/ 15 февраля 2011

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

Если у вас "заканчиваются" потоки, значит, они работают слишком долго.

0 голосов
/ 15 февраля 2011

Не переписывайте свой собственный ThreadPool.

Почему бы вам просто не использовать Pattern Adapter , чтобы фактически реализовать только ту логику, которая вам нужна?

...