Мое приложение захватывает сетевые пакеты (например, wirehark) в потоке захвата и позволяет другим компонентам регистрировать функции обратного вызова с условиями фильтра для захваченных пакетов. На данный момент я начинаю поток для каждого обратного вызова абонента каждый раз, когда я захватить пакет, как это:Пул потоков для быстрых всплесков коротких потоков?
foreach (CCallbackFilterCondition hCallback in m_ahSubscribers)
{
// Raise callbacks in separate threads so they don't block the capture thread
ParameterizedThreadStart hPTS = new ParameterizedThreadStart(hCallback.raiseIfMeetsConditions);
Thread hCallbackThread = new Thread(hPTS);
hCallbackThread.Start(hPacket);
}
Каждый из этих потоков вероятно, будет работать всего несколько миллисекунд, но может работать дольше в зависимости от метода обратного вызова. Они запускаются каждый раз, когда пакет захватывается, что может быть очень частым.
Вопрос теперь в следующем: насколько высоки накладные расходы при запуске нового потока? Было бы лучше использовать пул постоянно работающих потоков вместо создания новых потоков на высокой частоте? Если мои обратные вызовы медленные, это может привести к началу много новых потоков, в то время как старые из них все еще работают, поэтому мне потребуется большое количество потоков в пуле, поэтому мне, вероятно, понадобится пул, динамически развивающийся. Но это может привести к тому, что многие простаивающие потоки будут отключены, если абонент откажется от подписки. Каковы ваши предложения?
'Paralell.For' и' Paralell.ForEach' предназначен только для этой цели (если ваша задача не довольная) –
@dcastro Так в чем проблема? Почему бы не отправить все и добавить его в коллекцию temp в одном потоке, а затем сделать «Paralell.ForEach» с коллекцией temp. Я что-то пропустил? –
Он, похоже, не хочет ждать окончания этих потоков, поэтому нет необходимости в создании темпа. Кажется, он ищет подход «огонь и забыть». Параметр Paralell.ForEach заканчивается, когда заканчиваются все задачи. – dcastro