2011-08-05 104 views
2

我正在使用StreamReader从TcpSocket中读取数据,并使用StreamWriter写入该TcpSocket。我想在一个线程中有读取代码,在另一个线程中有写入代码。我如何以线程安全的方式做到这一点?使用StreamReader/StreamWriter进行基本多线程处理

如果我这样做,那么我想作家线程将在许多情况下阻止:

lock (tcpClient) { 
    streamReader.ReadLine(); 
} 

这里将是作家代码:

lock (tcpClient) { 
    streamWriter.WriteLine(line); 
} 

回答

3

它是安全的发送上一个线程并在另一个线程上接收。在另一个线程

streamReader.ReadLine(); 

这:

所以,你可以在一个线程中执行此操作,而不必锁定tcpClient

streamWriter.WriteLine(line); 

+0

感谢您的回答,但这是否记录在任何地方? MSDN表示StreamReader和StreamWriter的实例成员并不保证是线程安全的。 – Tom

+1

我不确定这是记录在任何地方。线程安全声明只是几乎所有类的标准样板。 .NET Socket类是Winsock API的一个包装器,所以'StreamWriter.WriteLine'调用最终会导致对Winsock'send'函数的调用,该函数会将字节放入发送缓冲区中。 StreamReader.ReadLine()调用导致对Winsock的receive函数的调用,它从接收缓冲区读取字节。所以只要一个线程写入发送缓冲区并且有一个线程从接收缓冲区读取,就没有资源共享。 – dtb