2017-09-30 8 views
3

ファイルを開き、行ごとに読み込み、各行を操作して別のファイルに書き出すC#WPFプログラムがあります。その部分は正常に動作しました。私はいくつかの進捗報告を追加したいので、メソッドを非同期にし、進捗報告を待っていました。進捗報告は非常にシンプルです。画面上のラベルを更新するだけです。ここに私のコードです:Async Await進捗報告が機能しない

async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    OpenFileDialog openFileDialog = new OpenFileDialog(); 
    openFileDialog.Title = "Select File to Process"; 
    openFileDialog.ShowDialog(); 
    lblWaiting.Content = "Please wait!"; 
    var progress = new Progress<int>(value => { lblWaiting.Content = "Waiting "+ value.ToString(); }); 
    string newFN = await FileProcessor(openFileDialog.FileName, progress); 
    MessageBox.Show("New File Name " + newFN); 
} 

static async private Task<string> FileProcessor(string fn, IProgress<int> progress) 
{ 
    FileInfo fi = new FileInfo(fn); 
    string newFN = "C:\temp\text.txt"; 

    int i = 0; 

    using (StreamWriter sw = new StreamWriter(newFN)) 
    using (StreamReader sr = new StreamReader(fn)) 
    { 
     string line; 

     while ((line = sr.ReadLine()) != null) 
     { 
      // manipulate the line 
      i++; 
      sw.WriteLine(line); 
      // every 500 lines, report progress 
      if (i % 500 == 0) 
      { 
       progress.Report(i); 
      } 
     } 
    } 
    return newFN; 
} 

私は助け、助言や提案をいただければ幸いです。

答えて

4

あなたのメソッドをasyncとマークするだけで、実行フローにはほとんど影響がありません。これは、あなたが実行結果を得られないからです。代わりに、代わりにWriteLineReadLineWriteLineAsync

使用ReadLineAsync:UIスレッドを生成すると、ラベルが再描画されるようになります

static async private Task<string> FileProcessor(string fn, IProgress<int> progress) 
{ 
    FileInfo fi = new FileInfo(fn); 
    string newFN = "C:\temp\text.txt"; 

    int i = 0; 

    using (StreamWriter sw = new StreamWriter(newFN)) 
    using (StreamReader sr = new StreamReader(fn)) 
    { 
     string line; 

     while ((line = await sr.ReadLineAsync()) != null) 
     { 
      // manipulate the line 
      i++; 
      await sw.WriteLineAsync(line); 
      // every 500 lines, report progress 
      if (i % 500 == 0) 
      { 
       progress.Report(i); 
      } 
     } 
    } 
    return newFN; 
} 

PS。 awaitを使用しないasyncメソッドがあるため、コンパイラは最初のコードで警告を発する必要があります。

+0

OMG!出来た!!!私はとても興奮しています。私は最終的にこの非同期のものを理解し始めています。ありがとう、ありがとう、ありがとう!!!! – Missy

関連する問題