2016-12-13 12 views
0

"비동기 메서드가 '대기중인'연산자가없고 동기식으로 실행됩니다. 비공개 API 호출을 기다리거나 'Task.Run (... 기다리는 중') 연산자를 사용하는 것이 좋습니다. .) '백그라운드 스레드에서 CPU 바운드 작업을 수행 할 수 있습니다. 분명히 들리지만, 모든 프로세스를 실행하고 Await Task.WhenAll()을 processFiles 메서드에 포함했기 때문에 덮여 있다고 생각했습니다. ?..이 다른 방식으로 어떤 생각이 친절하게 감상 할 수있다비동기 대기 경고 대기

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Data.SqlClient; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 
    using System.IO; 


    namespace ProcessFiles 
    { 
     public partial class ProcessFiles : Form 
     { 
      public ProcessFiles(int userLevel, int userID) 
      { 
      } 

      private void btnProcess_Click(object sender, EventArgs e) 
      { 
       processFiles(); 

      } 

      async Task<int> processFiles() 
      { 
       var processingTasks = new List<Task>(); 
       foreach (string fileName in listBox1.Items) 
       { 
        processingTasks.Add(process012(fileName)); 
        processingTasks.Add(process123(fileName)); 
        processingTasks.Add(process234(fileName)); 

       } 
       await Task.WhenAll(processingTasks); 
       return (1); 
      } 


      async Task<int> process173(string fileName) 
      { 
       return (retVal); 

      } 

      async Task<int> process032(string fileName) 
      { 
       return (retVal); 
      } 

      async Task<int> process018(string fileName) 
      { 
       return (retVal); 
      } 
+5

'async' 키워드에는 3 가지 방법이 있지만 기다릴 필요가 없습니다. 메시지가 명확하지 않습니까? 또한 완료된 작업을 반환하려는 경우'return Task.FromResult'를'async'없이 사용하십시오 –

+0

나는 Task.WhenAll (processingTasks)를 기다리고 있다고 생각했습니다; 모든 것이 완료 될 때까지 기다리기에 충분했다. 마지막 세 가지 방법은 기다리지 않아도됩니다. – Missy

+3

그들은'ayncit '을 필요로한다는 것을 의미하는'async'를 가지고 있습니다. 그리고'btnProcess_Click'도 마찬가지입니다. –

답변

2

당신의 processXXX 방법에 작업 비동기 사용할 필요는()> 대신에 당신은 주요 processFiles의 작업을 기다리고 것이다 작업을 방법을 < INT를 반환 :

 private async void btnProcess_Click(object sender, EventArgs e) 
     { 
      await processFiles(); 
     } 

     async Task<int> processFiles() 
     { 
      var processingTasks = new List<Task>(); 
      foreach (string fileName in listBox1.Items) 
      { 
       processingTasks.Add(process012(fileName)); 
       processingTasks.Add(process123(fileName)); 
       processingTasks.Add(process234(fileName)); 

      } 
      await Task.WhenAll(processingTasks); 
      return (1); 
     } 


     Task<int> process173(string fileName) 
     { 
      return Task.FromResult(retVal) 
     } 

     Task<int> process032(string fileName) 
     { 
      return Task.FromResult(retVal) 
     } 

     Task<int> process018(string fileName) 
     { 
      return Task.FromResult(retVal) 
     } 
+0

'await'가없는 방법이 3 가지 더 있습니다. –

+1

Theres는 완료된 작업을 기다리는 이유가 없습니다. 원하는 경우'Task process032 (..) {return Task.FromResult (retVal);}'를 사용하십시오. 여기에'async/await'을 사용하면 결코 사용되지 않는 상태 머신이 생성됩니다. –

+0

각 메소드 내부에 기다려야합니까? 내 계획은 모든 메소드가 동시에 실행되도록하고 Task.WhenAll (processingTasks); 충분하지 않니? – Missy