2017-09-30 1 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으로 메서드를 표시하는 것만으로도 실행 흐름에 아무런 영향을 미치지 않습니다. 왜냐하면 실행을 항복하지 않기 때문입니다.

사용 ReadLineAsync 대신 ReadLine 대신 WriteLineWriteLineAsync :

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; 
} 

레이블을 UI 스레드를 생성하고 수 그려야합니다.

추신. await을 사용하지 않는 async 메서드가 있기 때문에 컴파일러에서 초기 코드로 경고를 제기해야합니다.

+0

OMG! 그것은 일했다 !!! 나는이 비동기적인 물건을 마침내 이해하기 시작했습니다. 고마워요, 고마워요, 고마워요 !!!! – Missy