Поиск в Yahoo с использованием Java [закрыто]

Нет, NetworkStream не поддерживает отмену.

К сожалению, базовые API Win32 не всегда поддерживают отмену транзакции. Традиционно вы можете отменить все ввода / вывода для определенного дескриптора, но метод отмены одной операции ввода-вывода является довольно недавним. Большинство .NET BCL были написаны против XP API (или старше), который не включал CancelIoEx.

Stream связывает эту проблему с помощью «подделки» поддержки отмены (и асинхронного ввода / O тоже), даже если реализация не поддерживает его. «Поддельная» поддержка отмены просто проверяет токен сразу, а затем запускает регулярное асинхронное чтение, которое нельзя отменить. Вот что вы видите с NetworkStream.

С сокетами (и большинством типов Win32) традиционный подход заключается в том, чтобы закрыть дескриптор, если вы хотите прервать связь. Это приводит к сбою всех текущих операций (как чтения, так и записи). Технически это является нарушением безопасности потока BCL, как это описано в документе, но оно действительно работает.

cts.Token.Register(() => client.Close());
...
catch (ObjectDisposedException)

Если, с другой стороны, вы хотите обнаружить сценарий полуоткрытия (где ваша сторона читает, но другая сторона потеряла свое соединение), то лучшим решением является периодическая отправка данных. Я описываю это больше в своем блоге .

-8
задан Fabian Barney 15 March 2012 в 09:01
поделиться