2015-03-27 1 views
0

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

Приложение использует довольно сильно ThreadPool, и эта сторожевая вещь взаимодействует с ThreadPool.

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

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

+0

Да, есть способы. Тем не менее, почему в первую очередь вы столкнулись с потоками ThreadPool? Может быть, стоит посмотреть, где вы можете использовать асинхронный ввод-вывод вместо блокировки ввода-вывода? – Luaan

+0

Является ли этот «сторожевой таймер» работает на его выделенной теме? – Magnus

+0

@Magnus: Он работает по выделенному потоку, а не из threadpool, но он ждет, пока он не получит сообщение, исходящее из потока threadpool. –

ответ

1

Вы можете попробовать использовать метод ThreadPool.SetMinThreads.

+0

Что мне делать? Поместите здесь большое количество и еще большее число в SetMaxThreads? Это будет трюк? –

2

Ответ от lawliet29 может помочь в некоторой степени. Но даже со многими потоками пул потоков может стать насыщенным, а некоторые задачи могут быть поставлены в очередь в конце глобальной очереди задач.

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

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

https://github.com/helios-io/DedicatedThreadPool

Мы можем планировать задачи на эту очередь с помощью специального планировщика задач.

+0

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