0

新しい c# 非同期設計パターンを学習するためのコードを書いています。そこで、テキスト ファイルの行と単語をカウントし、読み取りの進行状況を表示する小さな Windows フォーム プログラムを作成することを考えました。

ディスク スワッピングを避けて、ファイルを MemoryStream に読み込んでから、StreamReader を作成してテキストを行ごとに読み込んでカウントします。

問題は、プログレスバーを正しく更新できないことです。ファイルを読みましたが、常にバイトが不足しているため、プログレスバーが完全にいっぱいになりません。

これを達成するには、手かアイデアが必要です。ありがとう

public async Task Processfile(string fname)
{

  MemoryStream m;
  fname.File2MemoryStream(out m); // custom extension which read file into
                                  // MemoryStream

  int flen = (int)m.Length;       // store File length
  string line = string.Empty;     // used later to read lines from streamreader


  int linelen = 0;                // store current line bytes
  int readed = 0;                 // total bytes read


    progressBar1.Minimum = 0;     // progressbar bound to winforms ui
    progressBar1.Maximum = flen;

    using (StreamReader sr = new StreamReader(m)) // build streamreader from ms
    {

       while ( ! sr.EndOfStream ) // tried ( line = await sr.ReadLineAsync() ) != null
       {

          line = await sr.ReadLineAsync();

            await Task.Run(() =>
            {

              linelen = Encoding.UTF8.GetBytes(line).Length;  // get & update
              readed += linelen;                              // bytes read

                                                         // custom function
              Report(new Tuple<int, int>(flen, readed)); // implements Iprogress
                                                         // to feed progress bar

             });                     
         }
     }

        m.Close();    //  releases MemoryStream
        m = null;            
 }
4

1 に答える 1