新しい 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;
}