C# 如何处理对同一套接字的读写操作
我建立了与套接字服务器的连接,然后开始大量地读写数据。 异常立即发生: mscorlib.dll中发生了“System.InvalidOperationException”类型的异常,但未在用户代码中处理该异常 其他信息:流当前正由流上的前一个操作使用。 我怎么能发现呢C# 如何处理对同一套接字的读写操作,c#,sockets,stream,tcpclient,C#,Sockets,Stream,Tcpclient,我建立了与套接字服务器的连接,然后开始大量地读写数据。 异常立即发生: mscorlib.dll中发生了“System.InvalidOperationException”类型的异常,但未在用户代码中处理该异常 其他信息:流当前正由流上的前一个操作使用。 我怎么能发现呢 _reader.ReadLineAsync(); 正在接收一些数据,我应该等待写入,反之亦然 该类由客户端使用,该客户端基本上将从服务器接收到的数据发送回服务器 public class TcpClientWorker2 {
_reader.ReadLineAsync();
正在接收一些数据,我应该等待写入,反之亦然
该类由客户端使用,该客户端基本上将从服务器接收到的数据发送回服务器
public class TcpClientWorker2
{
private TcpClient _client;
private Thread _t;
private NetworkStream _networkStream;
private StreamWriter _writer;
private StreamReader _reader;
public TcpClientWorker2()
{
var ipHostInfo = Dns.Resolve(Dns.GetHostName());
var ipAddress = ipHostInfo.AddressList[0];
_client = new TcpClient();
_client.Connect(ipAddress, 10000);
_t = new Thread(Run);
}
public async void Run()
{
_networkStream = _client.GetStream();
_reader = new StreamReader(_networkStream);
_writer = new StreamWriter(_networkStream) { AutoFlush = true };
while (true)
{
var data = await _reader.ReadLineAsync();
//perform callback (send the data immediately back to server)
}
}
public void Start()
{
_t.Start();
}
public async Task Send(string text)
{
await _writer.WriteLineAsync(text);
}
}
从这个来源你可以得到确认: 可以在NetworkStream类的实例上同时执行读写操作,而无需同步。只要写操作有一个唯一的线程,读操作有一个唯一的线程,读线程和写线程之间就不会有交叉干扰,也不需要同步 我们可以在代码中看到只有一个线程在读,但是在代码中没有确认只有一个线程在写。
这是您应该进一步研究的部分。您应该同时读取和写入网络流。我怀疑您的代码可能是在另一个线程正在编写的同时编写的,这是导致失败的原因。请为您的错误发布堆栈跟踪。是的,这是正确的,我是从不同的线程写入的。当.ReadLineAsync被阻塞时,如何从同一线程写入?可以使用不同的读写器线程。你只需要确保只有一个线程读取和一个线程写入。