我需要在客户端接收多个消息,但是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/