【发布时间】:2015-08-12 16:55:48
【问题描述】:
我建立了与我的套接字服务器的连接,然后开始大量读取和写入数据。 立即发生异常:
mscorlib.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理
其他信息:该流当前正被之前对该流的操作使用。
如何检测到
_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);
}
}
【问题讨论】:
-
您应该同时读取和写入网络流。我怀疑您的代码可能在另一个线程正在编写的同时正在编写,这是失败的秘诀。请发布您的错误的堆栈跟踪。
-
是的,这是正确的,我是从不同的线程写的。 .ReadLineAsync 阻塞时如何从同一个线程写入?
-
你可以有不同的读者和作者线程。你只需要确保只有一个线程读取和一个线程写入。
标签: c# sockets stream tcpclient