Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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 TcpClient-对StreamWriter的后续调用仅写入第一个_C#_Multithreading_Tcpclient_Streamwriter - Fatal编程技术网

C# C TcpClient-对StreamWriter的后续调用仅写入第一个

C# C TcpClient-对StreamWriter的后续调用仅写入第一个,c#,multithreading,tcpclient,streamwriter,C#,Multithreading,Tcpclient,Streamwriter,我有一个TCP连接和一个StreamWriter public void SendData(string data, TcpClient client) { StreamWriter writer = new StreamWriter(client.GetStream()); writer.WriteLine(data); writer.Flush(); } 当我随后像这样调用SendData时 SendData("hi", client); SendData("how

我有一个TCP连接和一个StreamWriter

public void SendData(string data, TcpClient client)
{
    StreamWriter writer = new StreamWriter(client.GetStream());
    writer.WriteLine(data);
    writer.Flush();
}
当我随后像这样调用SendData时

SendData("hi", client);
SendData("how are you", client);
SendData("?", client);
客户端只接收第一行。我向SendData方法添加了Thread.Sleep100,如下所示:

public void SendData(string data, TcpClient client)
{
    StreamWriter writer = new StreamWriter(client.GetStream());
    writer.WriteLine(data);
    writer.Flush();
    Thread.Sleep(100);
}

第二种情况运作良好。你认为我的解决方案可以接受吗?还是应该尝试更换客户?关于此问题的起因,您是否有任何经验或想法?

您通常不应该在一个TcpClient/NetworkStream上创建多个streamwriter。正如您在StreamWriter的文档中所看到的,它希望获得已包装流的所有权,并在您处置StreamWriter后对其调用Dispose。您应该只创建一个StreamWriter并使用它发送所有行,或者您必须创建leaveOpen标志设置为true的StreamWriter,这样您就可以在不意外处理TcpClient的情况下处理它们


这并不能直接回答为什么没有收到额外的行。我可能猜它与StreamWriter内部的缓冲有关,在处理流之前,StreamWriter不会完全刷新。因此,我将尝试处理StreamWriter和/或只创建一个StreamWriter。或者是另一边的信号接收不正常?在这种情况下,使用Wireshark、tcpdump或strace检查真正写入套接字的内容将是最容易的。

客户端正在统一地侦听一个名为Update的函数,该函数每帧调用一次。如果发送两次,第二个数据将在两帧之间发送,并且无法接收。睡眠是必要的

能否尝试使用var writer=new StreamWriterclient.getStream{SendDataHi,write;SendDataHow are?,writer;SendData?,writer;}?在writer上使用调用Dispose并销毁底层流。遗憾的是,tcp连接没有一个选项:如果您在其他地方也使用它,或者以后需要它,那么可以。但是你可以尝试在外部创建StreamWriter并按照@Matthias247的建议传递给SendData,它将只创建一个writer。这是一个很好的约定,我实现了它。谢谢你的帮助,但问题仍然没有改变。谢谢你的解释。我相应地修改了代码,看起来更干净了。但问题仍然存在。