c# - 无限 Do...while 循环使用 Async Await

标签 c# async-await

我有以下代码:

public static async Task<string> ReadLineAsync(this Stream stream, Encoding encoding)
{
byte[] byteArray = null;
using (MemoryStream ms = new MemoryStream())
{
   int bytesRead= 0;
   do
   {
       byte[] buf = new byte[1024];
       try
       {
             bytesRead = await stream.ReadAsync(buf, 0, 1024);
             await ms.WriteAsync(buf, 0, bytesRead);
       }
       catch (Exception e)
       {
             Console.WriteLine(e.Message + e.StackTrace);
       }
   } while (stream.CanRead && bytesRead> 0);

   byteArray = ms.ToArray();
   return encoding.GetString(ms.ToArray());
}

我正在尝试读取 Stream 以异步写入 MemoryStream,但是 Do...while 循环未能中断。我的意思是这是一个无限循环。如何解决?

最佳答案

首先,在特殊情况下,您的循环将无限期地继续下去。您不应该捕获并忽略异常。

其次,如果流实际上没有结束,那么bytesRead 永远不会为零。我怀疑是这种情况,因为方法名称 (ReadLineAsync) 对我来说并不意味着它会一直读取到流结束。

附言CanRead 不会因特定流而改变。重要的是流执行读取操作是否具有语义意义,而不是它是否可以立即读取

关于c# - 无限 Do...while 循环使用 Async Await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16902766/

相关文章:

c# - VS 2012 发布后,使用异步与 VS 2010 的正确方法?

ios - 如何使用调度组在类初始化时异步等待 Firebase 回调?

c# - 默认参数和 [可选] 参数有什么区别?

c# - 简单的C#正则表达式

c# - ASP.NET 应用程序体系结构

javascript - 了解放置 `await` 关键字的位置

javascript - Promise 无法通过 setTimeOut 的递归函数解析

c# - 异步触发多个任务并等待它们完成

c# - 在进行备份时使用目录的 Last Modified 时间戳是否可靠?

c# - 强制内部加入多对多关系 Entity Framework