TcpClient BeginRead / Отправить поток безопасно? - PullRequest
6 голосов
/ 06 апреля 2010

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

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

Также, если я закрою TcpClient с помощью:

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

Должен ли я lock() на TcpClient также?

1 Ответ

9 голосов
/ 06 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...