Как лучше всего отменить запрос на получение сокета?C#

Место общения программистов C#
Ответить
Anonymous
 Как лучше всего отменить запрос на получение сокета?

Сообщение Anonymous »

В C# есть три способа получить данные TCP через сокет:
  • Код: Выделить всё

    Socket.Receive
    — синхронный блокирующий метод. Он не возвращается до тех пор, пока не завершится успешно, за исключением сбоя или [необязательно] тайм-аута.
  • Код: Выделить всё

    Socket.BeginReceive
    является асинхронным, предоставленный обратный вызов/делегат вызывается, когда есть данные для получения, с использованием устаревшего шаблона Begin/End
  • Код: Выделить всё

    Socket.ReceiveAsync
    начинает асинхронный запрос на получение данных.
Однако, насколько я понимаю, ни один из них на самом деле не позволяет отменить операцию получения? В документации предполагается, что EndReceive используется для завершения чтения, а не для завершения запроса?

Вы часто видите код типа

Код: Выделить всё

while(socket.Available==0 && !cancel)Sleep(50); if(!cancel)socket.Receive(...);
Но это ужасно.

Если я хочу сидеть и ждать данных, но через какое-то время точка отменить получение, скажем, пользователь нажимает кнопку «Стоп», как это можно аккуратно сделать, чтобы не вызвать обратный вызов позже, когда это неожиданно?

У меня было задавался вопросом о закрытии сокета, что могло бы привести к сбою операции приема, но это кажется несколько некрасивым. Правильно ли я мыслю, или различные методы API, перечисленные выше, допускают прямую отмену, чтобы я не рисковал зависать в асинхронных операциях?

Подробнее здесь: https://stackoverflow.com/questions/600 ... ve-request
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»