如果我在关联的网络流上调用了异步TcpClient
,那么使用.NET BeginRead()
我还可以在另一个线程上调用该流上的Write()
吗?
或者我必须lock()
TcpClient
从BeginRead
回调的代码中的TcpClient
以及执行发送的代码吗?
此外,如果我使用:
关闭client.GetStream().Close();
client.Close();
lock()
我是否也必须TcpClient
上的{{1}}?
答案 0 :(得分:9)
TcpClient
的读/写部分是线程安全的,如NetworkStream
类的文档中所述(TcpClient
用于其实际IO的内容):< / p>
读写操作即可 同时进行 NetworkStream类的实例 无需同步。 只要有一个独特的线程 用于写操作和一个 用于读取操作的唯一线程, 不会有交叉干扰 读写线程之间没有 同步是必需的。
要关闭,如果在一个线程上关闭TcpClient
,但在关闭后尝试在另一个线程上使用它进行读/写,则会抛出异常。您可以在线程关闭之前同步线程,以防止它们使用TcpClient
,或者只捕获并处理异常(例如,您可以退出线程的执行循环)。