2016-05-31 4 views
-4

나는 다음과 같은 조치를 트리거하는 버튼으로 윈도우 폼 응용 프로그램이 조건이 거짓 (documentsView.CheckedItemsCount이 0 임) 인 경우에도 작업이 여전히 실행됩니다. 그러나 작업이 완료되면 MessageBox에서 "하나 이상의 문서를 선택하십시오."라는 메시지가 나타납니다. 도움이된다면C# 작업 제어 흐름 논리 제대로 작동하지

TimeStampPdfs 방법은 다음과 같습니다 메시지 상자가 표시됩니다 "파일이에 ... 인쇄 스크립트에 타임 스탬프와 함께 저장"때문에

private System.Threading.Tasks.Task TimeStampPdfs() => System.Threading.Tasks.Task.Run(() => 
    { 
     for (int i = 0; i < documentsView.CheckedItems.Count; i++) 
     { 
      var currentDocument = documentsView.CheckedItems[i].ToString(); 
      if (!string.Equals(
       System.IO.Path.GetExtension(currentDocument), ".pdf", System.StringComparison.InvariantCultureIgnoreCase)) 
      { 
       currentDocument = ConvertToPdf(currentDocument); 
      } 
      TimeStampPdf(currentDocument); 
      Report(new ProgressReport 
      { 
       Total = documentsView.CheckedItems.Count, 
       CurrentCount = i + 1 
      }); 
     } 
    }).ContinueWith(t => 
    { 
     System.Windows.Forms.MessageBox.Show("Files saved with time-stamp on print script in " + OutputRootPath); 
    }, 
     System.Threading.CancellationToken.None, 
     System.Threading.Tasks.TaskContinuationOptions.OnlyOnRanToCompletion, 
     System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext() 
    ); 

나는 그것을 실행 것을 알고있다.

+2

'TimeStampPdf'가 void 메소드로 정의되었지만 반환 값 (?) *을 사용하여 'PerformTask'를 호출했기 때문에이 방법도 컴파일되지 않습니다. – sstan

+0

또한 호출 할 때'string'을'TimeStampPdf'에 건네주지 않습니다. – juharr

+0

@sstan 죄송합니다, 잘못된 방법을 게시했습니다. 나는 비슷한 이름을 가진 두 명을 가지고 있으며 서두르지 말고 부주의 한 실수를 저질렀습니다. 이제 올바른 방법이 문제가되었습니다. –

답변

1

문제는 조건이 false (documentsView.CheckedItemsCount가 0 임) 인 경우에도 작업이 여전히 실행된다는 것입니다. 전에 코드가 여기에 TimeStampPdfs 작업을 시작하기 때문이다

, PerformTask 전화 : 즉

await PerformTask(TimeStampPdfs()); 

, await 작업을 시작하지 않는다; 대신 TimeStampPdfs이 작업을 시작하고 이미 진행중인 작업을 반환합니다. await 그러면 작업을 (완료)으로 (비동기 적으로) 대기합니다. 내 async intro이 도움이 될 수 있습니다. 내가 제대로 코드를 이해한다면

, 당신은 아마 다음과 같이 작업을 반환하는 대표를 전달하려는 :

보조 노트에
private async Task PerformTask(Func<Task> func) 
{ 
    if(documentsView.CheckedItems.Count > 0) 
    { 
    Enabled = false; 
    try 
    { 
     await func(); 
    } 
    ... 
} 


await PerformTask(() => TimeStampPdfs()); 

, 내가 TimeStampPdfs 대신 ContinueWithawait을 사용하는 것이 좋습니다 :

private async Task TimeStampPdfs() 
{ 
    await Task.Run(() => 
    { 
    ... 
    }); 
    MessageBox.Show("Files saved with time-stamp on print script in " + OutputRootPath); 
} 
+0

고마워, 고쳐 줬어. –