Для асинхронного приема данных из сокета .Net поддерживает симметричные вызовы BeginReceive/EndReceive. В основном вы вызываете BeginReceive()
, чтобы начать прослушивание и идентифицировать обратный вызов, который должен вызываться, когда поступают данные. Внутри обратного вызова вы вызываете EndReceive()
для извлечения данных и завершения асинхронной операции чтения.Правильное использование BeginReceive/EndReceive?
Я пишу C# /. Чистое программное обеспечение для управления некоторым промышленным оборудованием. Панель управления позволяет пользователям настраивать и инициализировать оборудование, и после его инициализации BeginReceive()
называется началом прослушивания данных. В обратном вызове EndReceive()
используется для извлечения данных, но я хочу возобновить прослушивание сразу, поэтому я думаю, что я должен позвонить BeginReceive()
снова сразу после выполнения EndReceive()
. Это верно?
Если да, то есть проверка или тест, который я могу использовать в другом месте в коде, чтобы узнать, является ли BeginReceive()
уже назвали, так что я не пытаюсь вызвать BeginReceive()
два раза подряд на одной и той же розетке, перед тем EndReceive()
было называется?
Это правильно. Я не знаю, можете ли вы проверить, был ли он уже вызван (кроме вашего собственного настраиваемого флага). Вполне возможно, что два вызова 'BeginRecieve' ничего не сделают; проверьте документацию. – BradleyDotNET
'Socket', или, скорее, ОС, проверяет это самостоятельно.Если вы попытаетесь вызвать 'BeginReceive', пока другой прием уже выполняется, он выдает исключение, представляющее ошибку сокета WSAEALREADY (я думаю). В конце концов, нет смысла пытаться получать в два буфера из одного и того же сокета одновременно! Но если вы спросите, есть ли свойство на 'Socket', которое сообщает вам, выполняется ли операция, ответ - нет (это было бы бесполезно в любом случае из-за неизбежного состояния гонки). Вы можете реализовать свою собственную блокировку, если вам нужно. –
Вы не должны называть начало приема способом, который может привести к повторному включению. Это точно. если вы столкнулись с ситуацией, когда вам нужен флаг, чтобы узнать, вызвали вы его или нет, это, вероятно, означает, что ваша архитектура неверна. –