Вопреки комментарию Джейми Диксона, сценарий является исключительным.Обратите внимание на именование метода и его параметров: BeginReceive (TimeSpan timeout)
Если бы метод был назван BeginTryReceive, это было бы совершенно нормально, если бы не было получено никакого сообщения.Присвоение имени BeginReceive (или Receive для версии синхронизации) подразумевает, что сообщение должно поступить в очередь.То, что параметр TimeSpan называется timeout, также имеет значение, потому что время ожидания является исключительным.Тайм-аут означает, что ответ был ожидаемым, но не был дан, и вызывающий абонент решает прекратить ожидание и предполагает, что произошла ошибка.Когда вы вызываете BeginReceive / Receive с 1-секундным таймаутом, вы заявляете, что, если к тому времени в очередь не поступило ни одного сообщения, что-то должно быть не так, и нам нужно это обработать.
Способ, которым я бы реализовалэто, если я понимаю, что вы хотите сделать правильно, это:
- Call BeginReceive либо с очень большим тайм-аутом, либо даже без тайм-аута, если я не вижу пустую очередь как ошибку.
- Присоединить обработчик событий к событию ReceiveCompleted, которое 1) обрабатывает сообщение и 2) снова вызывает BeginReceive.
- Я бы НЕ использовал бесконечный цикл.Это и плохая практика, и полностью избыточная при использовании асинхронных методов, таких как BeginReceive.
- edit: Чтобы отказаться от очереди, которая не читается ни одним клиентом, попросите авторов очереди заглянуть вочередь, чтобы определить, «мертв» ли он.
edit: У меня есть другое предложение.Поскольку я не знаю деталей вашего заявления, я понятия не имею, возможно ли оно или целесообразно.Мне кажется, что вы в основном устанавливаете соединение между клиентом и сервером, используя очередь сообщений в качестве канала связи.Почему это «связь»?Потому что очередь не будет записана, если никто не слушает.Я думаю, это в значительной степени то, что есть связь.Не будет ли более уместным использовать сокеты или именованные каналы для передачи сообщений?Таким образом, клиенты просто закрывают объекты Stream, когда они закончили чтение, и серверы немедленно уведомляются.Как я уже сказал, я не знаю, может ли это работать на то, что вы делаете, но похоже на более подходящий канал связи.