如何处理读写同一个套接字

时间:2015-05-29 17:55:07

标签: c# sockets stream tcpclient

我建立了与套接字服务器的连接,然后开始极大地读取和写入数据。 立即发生异常:

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);
    }
}

1 个答案:

答案 0 :(得分:1)

从这个来源获得确认: https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

  

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

我们可以在您的代码中看到只有一个线程读取,但您的代码中没有确认只有一个线程写入。 这是你应该进一步调查的部分。