Оптимизируйте, только если то, что у вас есть, работает недостаточно хорошо, и если вам нужно оптимизировать, делайте это на основе метрик - попробуйте разные подходы и используйте то, что работает лучше всего.
Тем не менее, я не уверен, что этот подход более эффективен, чем просто наличие n + 1 потоков в цикле, который блокирует ReceiveFrom
, а затем завершает обработку каждого пакета синхронно,избегая использования как асинхронного ввода / вывода, так и организации потоков между потоками.Установите n на количество устройств с узкими местами (обычно ядра процессора, но шпиндели могут быть и вашим ограничивающим ресурсом, если вы сильно связаны с вводом / выводом, или, возможно, и тем, и другим);Часть «+ 1» предназначена только для того, чтобы избежать простоя устройства под нагрузкой, когда поток делает что-то еще.
У меня были некоторые очень болезненные ситуации с асинхронным I на основе ThreadPool
и BeginXxx
./ O в .Net (как в полной, так и в компактной среде), поэтому я вообще не рекомендую их использовать.С другой стороны, большая часть боли (по крайней мере, от асинхронного ввода-вывода) могла быть связана с враждебным кодом других;ThreadPool
просто не надежен на компактной основе.: -)