TcpClient是BeginRead / Send线程安全吗?

时间:2010-04-06 07:22:39

标签: c# .net thread-safety tcpclient networkstream

如果我在关联的网络流上调用了异步TcpClient,那么使用.NET BeginRead()我还可以在另一个线程上调用该流上的Write()吗?

或者我必须lock() TcpClientBeginRead回调的代码中的TcpClient以及执行发送的代码吗?

此外,如果我使用:

关闭client.GetStream().Close(); client.Close();
lock()

我是否也必须TcpClient上的{{1}}?

1 个答案:

答案 0 :(得分:9)

TcpClient的读/写部分是线程安全的,如NetworkStream类的文档中所述(TcpClient用于其实际IO的内容):< / p>

  

读写操作即可   同时进行   NetworkStream类的实例   无需同步。   只要有一个独特的线程   用于写操作和一个   用于读取操作的唯一线程,   不会有交叉干扰   读写线程之间没有   同步是必需的。

要关闭,如果在一个线程上关闭TcpClient,但在关闭后尝试在另一个线程上使用它进行读/写,则会抛出异常。您可以在线程关闭之前同步线程,以防止它们使用TcpClient,或者只捕获并处理异常(例如,您可以退出线程的执行循环)。