C# TcpClient BeginRead/Send线程是否安全?
使用.NETC# TcpClient BeginRead/Send线程是否安全?,c#,.net,thread-safety,tcpclient,networkstream,C#,.net,Thread Safety,Tcpclient,Networkstream,使用.NETTcpClient如果我在相关联的网络流上调用了异步BeginRead(),那么我仍然可以在另一个线程的该流上调用Write() 或者我必须在从开始调用的代码中锁定tcp客户端,以及执行发送的代码 另外,如果我关闭tcp客户端: client.GetStream().Close(); client.Close(); 我是否也必须对TcpClient进行lock()?TcpClient的读/写部分是线程安全的,如NetworkStream类的文档中所述(这是TcpClient用于其实
TcpClient
如果我在相关联的网络流上调用了异步BeginRead()
,那么我仍然可以在另一个线程的该流上调用Write()
或者我必须在从开始
调用的代码中锁定tcp客户端
,以及执行发送的代码
另外,如果我关闭tcp客户端
:
client.GetStream().Close();
client.Close();
我是否也必须对
TcpClient
进行lock()
?TcpClient
的读/写部分是线程安全的,如NetworkStream
类的文档中所述(这是TcpClient
用于其实际IO的部分):
读写操作可以是
在同一台计算机上同时执行
NetworkStream类的实例
不需要同步。
只要有一个唯一的线程
对于写入操作和一个
读取操作的唯一线程,
不会有交叉干扰
在读线程和写线程之间
需要同步
关于关闭,如果您在一个线程上关闭
TcpClient
,但在关闭后尝试在另一个线程上使用它进行读/写,则会引发异常。您可以在线程关闭之前同步线程,以防止它们使用TcpClient
,也可以捕获并处理异常(例如,您可能会退出线程的执行循环)。谢谢,我在MSDN my bad中完全错过了这一点-我道歉。在结束时,我正在捕获并处理异常,但只是不确定这是否是不可靠的,因此感谢您澄清这一点,因为据我所知,这没有记录在案。是的,如果您尝试写入/读取已关闭的TcpClient,it抛出异常是完全正常的。您将在所有.NET套接字API中看到这一点。