Стоит ли ThreadPool в этом сценарии? - PullRequest
3 голосов
/ 03 декабря 2010

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

В большинстве случаев это довольно короткий поток. Но иногда это может занять очень много времени (ожидание вызова потока GUI).

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

Но я также читал, что если в ThreadPool заканчиваются потоки, он просто будет ждать, пока не выйдет какой-то другой поток (не в порядке, что я делаю).

Итак, насколько вероятно, что у меня закончатся потоки? И действительно ли преимущество ThreadPool того стоит? (При сканировании не требуется слишком много времени, чтобы сканирование «запустило» логику потока.)

Ответы [ 6 ]

4 голосов
/ 03 декабря 2010

Это зависит от того, что вы подразумеваете под «очень долгим временем» и насколько распространен этот сценарий.

В разделе MSDN " Управляемый пул потоков " содержатся хорошие рекомендации, когда не использовать потоки пула потоков:

Существует несколько сценариев, в которых целесообразно создавать собственные потоки и управлять ими вместо использования потоков пула потоков:

  • Вам нужна нить переднего плана.
  • Требуется, чтобы поток имел определенный приоритет.
  • У вас есть задачи, из-за которых поток блокируется на длительные периоды времени. максимальное количество потоков в пуле темы, поэтому большое количество заблокировано потоки пула потоков могут помешать задачи от запуска.
  • Вам необходимо разместить нити в однопоточной квартире. Все ThreadPool темы находятся в многопоточная квартира.
  • Вам необходимо иметь стабильную идентификацию, связанную с потоком, или посвятить поток задаче.
1 голос
/ 03 декабря 2010

Смысл пула потоков состоит в том, чтобы амортизировать стоимость создания потоков, которые не являются недорогими для раскрутки и разрушения. Если у вас короткое задание, стоимость создания / уничтожения потока может составлять значительную часть общего времени выполнения. Максимальное количество потоков в пуле потоков зависит от версии .NET Framework, обычно от десятков до сотен на процессор. Количество потоков масштабируется в зависимости от доступной работы.

У вас закончатся потоки, и вам придется ждать, пока поток станет доступным? Это зависит от вашей рабочей нагрузки. Вы можете получить максимальное количество потоков, доступных через ThreadPool.GetMaxThreads (). Скорее всего (основываясь на описании вашей проблемы), что это число достаточно велико.

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getmaxthreads.aspx

Другой вариант - управлять собственным пулом потоков сканирования и назначать им работу, а не создавать новый поток для каждого сканирования. Лично я бы сначала попробовал пул потоков и управлял вашими собственными потоками только в случае необходимости. Более того, я хотел бы изучить методы асинхронного программирования в .NET. Методы будут выполняться в пуле потоков, но они дадут вам гораздо более приятный опыт программирования, чем ручное управление потоками.

1 голос
/ 03 декабря 2010

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

0 голосов
/ 03 декабря 2010

В .net (и в Windows в целом) всегда следует поменять вопрос: «Стоит ли создавать новый поток в этом сценарии?»

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

Если вы решите развернуть новый поток, вскоре вы начнете беспокоиться о повторном использовании потокаесли он уже запущенТогда вы начнете беспокоиться о том, что иногда поток работает, но кажется, что он занимает слишком много времени, и поэтому вы должны создать новый.Тогда вы решите сделать так, чтобы поток не выходил сразу после окончания работы, а немного подождал, если придет новая работа. А потом ... бац!Вы создали свой собственный пул потоков.В этот момент вы должны просто выполнить резервное копирование и использовать системный файл.

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

(И, конечно, начиная с .net 2.0, вы можете установить максимальное количество потоков, так что вы можете настроить число, если вам абсолютно необходимо.)

Другие направили вас в MSDN: " Пул управляемых потоков ".Я повторю это направление, так как статья хороша, но, на мой взгляд, продает пул потоков недостаточно сложно.:)

0 голосов
/ 03 декабря 2010

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

Если программное обеспечение используется в супермаркете, пока маловероятно, что вы будете анализировать более 5 штрих-кодов одновременно.Если его запустить на внутреннем сервере для целого ряда супермаркетов.Тогда может быть активным 30-100 одновременных запросов.

При таком типе создания теории маловероятно, что у вас закончатся потоки, даже на встроенном оборудовании.Если у вас одновременно работает около дюжины запросов, и ваш код работает, то можно просто оставить все как есть.

Хотя пул потоков - это просто абстракция, и вы можете иметь очередь вПосредине, которая ставит запрос в очередь в пул потоков, в этом сценарии для вышеприведенного примера row-to, я чувствую себя комфортно в очереди 100-1000 запросов против пула потоков с 10 потоками.

0 голосов
/ 03 декабря 2010

Если в большинстве случаев это короткие потоки, вы можете использовать пул потоков или BackgroundWorker , который вытягивает потоки из пула.

...