Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理对同一套接字的读写操作_C#_Sockets_Stream_Tcpclient - Fatal编程技术网

C# 如何处理对同一套接字的读写操作

C# 如何处理对同一套接字的读写操作,c#,sockets,stream,tcpclient,C#,Sockets,Stream,Tcpclient,我建立了与套接字服务器的连接,然后开始大量地读写数据。 异常立即发生: mscorlib.dll中发生了“System.InvalidOperationException”类型的异常,但未在用户代码中处理该异常 其他信息:流当前正由流上的前一个操作使用。 我怎么能发现呢 _reader.ReadLineAsync(); 正在接收一些数据,我应该等待写入,反之亦然 该类由客户端使用,该客户端基本上将从服务器接收到的数据发送回服务器 public class TcpClientWorker2 {

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

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

从这个来源你可以得到确认:

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

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

您应该同时读取和写入网络流。我怀疑您的代码可能是在另一个线程正在编写的同时编写的,这是导致失败的原因。请为您的错误发布堆栈跟踪。是的,这是正确的,我是从不同的线程写入的。当.ReadLineAsync被阻塞时,如何从同一线程写入?可以使用不同的读写器线程。你只需要确保只有一个线程读取和一个线程写入。