我需要在客户端接收多个消息,但是ReadLineAsync()仅读取第一条消息。

    //Server Side
    StreamWriter StwWriter = new StreamWriter(client.GetStream())
    {
        AutoFlush = true
    };
    for (int i = 0; i < 10; i++)
    {
        StwWriter.WriteLine("test");
    }
    // Client Side
    public async void WaitMessages()
    {
        while (LoginChat.Client.Connected)
        {
            try
            {
                var reader = new StreamReader(LoginChat.Client.TcpClt.GetStream());
                var data = await reader.ReadLineAsync();
                MessageBox.Show(data);
            }
            catch (Exception ex)
            {
              MessageBox.Show(ex.ToString());
            }
        }
    }
    WaitMessages();


输出仅显示第一条消息。怎么了?

最佳答案

StreamReader具有内部缓冲区,因此在执行此操作时:

var reader = new StreamReader(LoginChat.Client.TcpClt.GetStream());
var data = await reader.ReadLineAsync();


它可能读了不止一行。如果您随后继续使用相同的StreamReader实例来获取下一行,则没问题,但是您只读取了一行,然后丢弃了StreamReader。这意味着缓冲区中的所有内容都会丢失。

要解决-不要在每次循环迭代中创建新的StreamReader,而是使用一个实例:

public async Task WaitMessages()
{
    var reader = new StreamReader(LoginChat.Client.TcpClt.GetStream());
    while (LoginChat.Client.Connected)
    {
        try
        {
            var data = await reader.ReadLineAsync();
            MessageBox.Show(data);
        }
        catch (Exception ex)
        {
          MessageBox.Show(ex.ToString());
        }
    }
}

关于c# - 我在使用StreamReader/StreamWriter读取多个消息时遇到问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49850208/

10-12 19:19