c# (Connect)Stream readasync 无限读取 0
c# (Connect)Stream readasync reads 0 infinitely
给定以下从 Stream
异步读取的方法(简化):
private async void WaitForIncomingMessagesAsync()
{
var responseStream = WebRequest.Create("some url").GetResponse().GetResponseStream(); // onle here in the example
var buffer = new byte[8192];
var stringBuilder = new StringBuilder();
while (IsRunning /*set by other parts of the program*/)
{
int receivedDataCount;
do
{
receivedDataCount = await responseStream.ReadAsync(buffer, 0, buffer.Length);
if (receivedDataCount != 0)
{
stringBuilder.Append(Encoding.ASCII.GetString(buffer, 0, receivedDataCount));
}
} while (receivedDataCount > 0);
var receivedDataJson = stringBuilder.ToString();
Array.Clear(buffer, 0, buffer.Length);
stringBuilder.Clear();
}
}
在我收到流中的第一个 'message' 之前,这一切正常。
从那以后,它将不再停在 await
因为它总是读取 0.
流本身必须始终保持打开状态。
我错过了什么?我是否必须重置流、刷新它或将位置设置回 0?
responseStream.Position = 0;
或 responseStream.Seek(0, SeekOrigin.Begin)
throws NotSupportedException
根据您的代码,我假设您希望在每次外循环运行时阅读新消息。如果是这样,那么您的 GetResponse 应该在外循环内,否则一旦您的内部循环完成对流的迭代,您将永远不会读取新数据。
private async void WaitForIncomingMessagesAsync()
{
var buffer = new byte[8192];
var stringBuilder = new StringBuilder();
while (IsRunning)
{
using (var responseStream = WebRequest.Create("some url").GetResponse().GetResponseStream())
{
int receivedDataCount;
do
{
receivedDataCount = await responseStream.ReadAsync(buffer, 0, buffer.Length);
if (receivedDataCount != 0)
{
stringBuilder.Append(Encoding.ASCII.GetString(buffer, 0, receivedDataCount));
}
} while (receivedDataCount > 0);
}
var receivedDataJson = stringBuilder.ToString();
Array.Clear(buffer, 0, buffer.Length);
stringBuilder.Clear();
}
}
我还使用 (..) {} 构造将您的响应流包装到 中,因此您不必担心手动关闭和处理它。
给定以下从 Stream
异步读取的方法(简化):
private async void WaitForIncomingMessagesAsync()
{
var responseStream = WebRequest.Create("some url").GetResponse().GetResponseStream(); // onle here in the example
var buffer = new byte[8192];
var stringBuilder = new StringBuilder();
while (IsRunning /*set by other parts of the program*/)
{
int receivedDataCount;
do
{
receivedDataCount = await responseStream.ReadAsync(buffer, 0, buffer.Length);
if (receivedDataCount != 0)
{
stringBuilder.Append(Encoding.ASCII.GetString(buffer, 0, receivedDataCount));
}
} while (receivedDataCount > 0);
var receivedDataJson = stringBuilder.ToString();
Array.Clear(buffer, 0, buffer.Length);
stringBuilder.Clear();
}
}
在我收到流中的第一个 'message' 之前,这一切正常。
从那以后,它将不再停在 await
因为它总是读取 0.
流本身必须始终保持打开状态。
我错过了什么?我是否必须重置流、刷新它或将位置设置回 0?
responseStream.Position = 0;
或 responseStream.Seek(0, SeekOrigin.Begin)
throws NotSupportedException
根据您的代码,我假设您希望在每次外循环运行时阅读新消息。如果是这样,那么您的 GetResponse 应该在外循环内,否则一旦您的内部循环完成对流的迭代,您将永远不会读取新数据。
private async void WaitForIncomingMessagesAsync()
{
var buffer = new byte[8192];
var stringBuilder = new StringBuilder();
while (IsRunning)
{
using (var responseStream = WebRequest.Create("some url").GetResponse().GetResponseStream())
{
int receivedDataCount;
do
{
receivedDataCount = await responseStream.ReadAsync(buffer, 0, buffer.Length);
if (receivedDataCount != 0)
{
stringBuilder.Append(Encoding.ASCII.GetString(buffer, 0, receivedDataCount));
}
} while (receivedDataCount > 0);
}
var receivedDataJson = stringBuilder.ToString();
Array.Clear(buffer, 0, buffer.Length);
stringBuilder.Clear();
}
}
我还使用 (..) {} 构造将您的响应流包装到 中,因此您不必担心手动关闭和处理它。