Вы перегружаете стек TCP / IP. Windows (и я думаю, что на самом деле все стеки сокетов) имеют ограничение на количество сокетов, которые можно открывать в быстрой последовательности из-за того, как сокеты закрываются при нормальной работе. Всякий раз, когда сокет закрыт, он входит в состояние TIME_WAIT на определенное время (240 секунд IIRC). Каждый раз, когда вы опрашиваете, сокет расходуется из динамического диапазона по умолчанию (я думаю, что его около 5000 динамических портов чуть выше 1024), и каждый раз, когда заканчивается опрос, этот конкретный сокет переходит в TIME_WAIT. Если вы будете опрашивать достаточно часто, вы в конечном итоге будете использовать все доступные порты, что приведет к ошибке TCP 10048.
Как правило, WCF пытается избежать этой проблемы, объединяя соединения и тому подобное. Обычно это происходит с внутренними службами, которые не работают через Интернет. Я не уверен, что какая-либо из привязок wsHttp поддерживает пул соединений, но привязка netTcp должна. Я бы предположил, что именованные каналы не сталкиваются с этой проблемой. Я не могу сказать о привязке MSMQ.
Есть два решения, которые вы можете использовать, чтобы обойти эту проблему. Вы можете либо увеличить динамический диапазон портов, либо уменьшить период TIME_WAIT. Первый, вероятно, является более безопасным маршрутом, но если вы потребляете слишком много громкости сокетов (что не похоже на случай для вашего сценария), сокращение TIME_WAIT - лучший вариант (или оба вместе).
Изменение диапазона динамического порта
- Открыть regedit.
- Открытый ключ HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters
- Измените (или создайте как DWORD) значение MaxUserPort.
- Установите большее значение. (т.е. 65534)
Изменение задержки TIME_WAIT
- Открыть regedit.
- Открытый ключ HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters
- Редактировать (или создать как DWORD) TcpTimedWaitDelay.
- Установите меньшее значение. Значение в секундах. (т.е. 60 с задержкой в 1 минуту)
Одно из приведенных выше решений должно решить вашу проблему. Если это не изменится после изменения диапазона портов, я попытаюсь увеличить период вашего опроса, чтобы он происходил реже ... что даст вам больше возможностей для обхода задержки ожидания. В крайнем случае я бы изменил задержку ожидания времени.