Нет, NetworkStream
не поддерживает отмену.
К сожалению, базовые API Win32 не всегда поддерживают отмену транзакции. Традиционно вы можете отменить все ввода / вывода для определенного дескриптора, но метод отмены одной операции ввода-вывода является довольно недавним. Большинство .NET BCL были написаны против XP API (или старше), который не включал CancelIoEx
.
Stream
связывает эту проблему с помощью «подделки» поддержки отмены (и асинхронного ввода / O тоже), даже если реализация не поддерживает его. «Поддельная» поддержка отмены просто проверяет токен сразу, а затем запускает регулярное асинхронное чтение, которое нельзя отменить. Вот что вы видите с NetworkStream
.
С сокетами (и большинством типов Win32) традиционный подход заключается в том, чтобы закрыть дескриптор, если вы хотите прервать связь. Это приводит к сбою всех текущих операций (как чтения, так и записи). Технически это является нарушением безопасности потока BCL, как это описано в документе, но оно действительно работает.
cts.Token.Register(() => client.Close());
...
catch (ObjectDisposedException)
Если, с другой стороны, вы хотите обнаружить сценарий полуоткрытия (где ваша сторона читает, но другая сторона потеряла свое соединение), то лучшим решением является периодическая отправка данных. Я описываю это больше в своем блоге .