Используя.NET TcpClient
если я назвал асинхронное BeginRead()
на связанном сетевом потоке может я все еще звонить Write()
на том потоке на другом потоке?
Или сделайте я имею к lock()
TcpClient
в коде, который призван обратно от BeginRead
и код, который делает отправление?
Также, если я закрываюсь TcpClient
с:
client.GetStream().Close();
client.Close();
Сделайте я имею к lock()
на TcpClient
также?
Части чтения / записи TcpClient
являются потокобезопасными, как описано в документации для NetworkStream
класс (который TcpClient
использует для своего фактического ввода-вывода):
Операции чтения и записи могут выполняться одновременно в экземпляре NetworkStream класс без необходимости синхронизации. Пока существует один уникальный поток для операций записи и один уникальный поток для операций чтения, { {1}} не будет перекрестных помех между потоками чтения и записи, и синхронизация не потребуется.
Чтобы выполнить закрытие, если вы закроете TcpClient
в одном потоке, но затем попытаетесь читать / писать, используя его в другом потоке после его закрытия, будет сгенерировано исключение. Вы можете либо синхронизировать потоки до его закрытия, чтобы предотвратить их использование TcpClient
, либо просто перехватить и обработать исключение (например, вы можете выйти из цикла выполнения потока).