2010-04-06 2 views
4

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

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

Кроме того, если я закрыть TcpClient с:

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

ли я lock() на TcpClient, а?

ответ

8

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

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

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

+0

Спасибо, я полностью пропустил это в MSDN, мой плохой - прошу прощения. На закрытии я ловил и обрабатывал исключение, но просто не был уверен, что это было изворотливым, поэтому спасибо за разъяснение, что все в порядке, поскольку это не документировано, насколько я могу судить. – iam

+0

Да, это совершенно нормально, если вы попытаетесь написать исключение, если попытаетесь написать/прочитать из закрытого TcpClient. Вы увидите это во всех API-интерфейсах сокетов .NET. – Kazar

Смежные вопросы