6

私は次のコードを持っています:

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読み書きしようとしていますが、ループが壊れません。つまり、無限ループです。これを解決するには?MemoryStreamDo...while

4

5 に答える 5

0

CanRead が true で、bytesRead が 0 より大きい限り、ループ条件が実行されるように設定されています。ファイルが読み取り可能な場合、CanRead は常に true になります。これは、バイトの読み取りを開始する限り、常にゼロより大きいことを意味します。読み取る最大バイト数と最小バイト数を設定するか、他のコントロールを設定する必要があります。

于 2013-06-03T17:54:25.337 に答える
0

では、IMAP からストリームを取得していて、このメソッドはそのストリームをテキストに変換するためのものですか?
ストリームの周りに SteamReader を構築し、ReadToEndAsync または単に ReadToEnd のいずれかを呼び出してみませんか? これを非同期操作にする必要があるとは思えません。ストリームが電子メールのようなものである場合、ストリームが大きすぎて、ユーザーが読み取り中に UI がブロックされていることに気付くことはまずありません。
あなたのコメントの 1 つが示唆するように、これがまったく UI アプリではない場合、おそらく問題はさらに少なくなります。

私の仮定が間違っている場合は、この関数がどのように使用されているかについての情報を追加して、質問を更新するようお願いできますか。より多くの情報をお知らせいただければ、より適切な回答を得ることができます。

編集: あなたのメソッドが ReadLineAsync と呼ばれていることに気付きましたが、行末を探しているコードのどこにも表示されません。テキスト行を読むことが目的の場合、SteamReader は ReadLine と ReadLineAsync も提供します。

于 2013-06-03T18:51:59.423 に答える