Действительно ли TcpClient BeginRead/Send ориентирован на многопотоковое исполнение?

Используя.NET TcpClient если я назвал асинхронное BeginRead() на связанном сетевом потоке может я все еще звонить Write() на том потоке на другом потоке?

Или сделайте я имею к lock() TcpClient в коде, который призван обратно от BeginRead и код, который делает отправление?

Также, если я закрываюсь TcpClient с:

client.GetStream().Close();
client.Close();

Сделайте я имею к lock() на TcpClient также?

6
задан Luke Girvin 30 May 2017 в 14:13
поделиться

1 ответ

Части чтения / записи TcpClient являются потокобезопасными, как описано в документации для NetworkStream класс (который TcpClient использует для своего фактического ввода-вывода):

Операции чтения и записи могут выполняться одновременно в экземпляре NetworkStream класс без необходимости синхронизации. Пока существует один уникальный поток для операций записи и один уникальный поток для операций чтения, { {1}} не будет перекрестных помех между потоками чтения и записи, и синхронизация не потребуется.

Чтобы выполнить закрытие, если вы закроете TcpClient в одном потоке, но затем попытаетесь читать / писать, используя его в другом потоке после его закрытия, будет сгенерировано исключение. Вы можете либо синхронизировать потоки до его закрытия, чтобы предотвратить их использование TcpClient , либо просто перехватить и обработать исключение (например, вы можете выйти из цикла выполнения потока).

9
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: