【问题标题】:How to handle reading and writing to the same socket如何处理对同一个套接字的读取和写入
【发布时间】: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


【解决方案1】:

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

可以在 NetworkStream 类的实例上同时执行读取和写入操作,而无需同步。只要写操作只有一个线程,读操作只有一个线程,读写线程之间就不会相互干扰,也不需要同步。

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

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多