TcpClient是BeginRead/Send线程安全吗?

iam*_*iam 6 .net c# networkstream tcpclient thread-safety

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

还是我要lock()TcpClient代码被称为从后面BeginRead和不发送的代码?

如果我关闭了TcpClient:

client.GetStream().Close();
client.Close();
Run Code Online (Sandbox Code Playgroud)

我一定要lock()TcpClient呢?

Kaz*_*zar 9

读取/写入部分TcpClient是线程安全的,如NetworkStream类的文档中所述(这是TcpClient其实际IO 的用途):

可以在NetworkStream类的实例上同时执行读写操作,而无需同步.只要有一个用于写操作的唯一线程和一个用于读操作的唯一线程,读写线程之间就不会存在交叉干扰,也不需要同步.

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