2016-11-20 16 views
-1

この件名が繰り返し公開されていることを知っているので、私に親切にしてください。私はちょうどそれの周りに私の脳を得ることができません。私は本当に簡単な仕事をしています:ファイルのリストを見て、それぞれを処理します。それらがすべて終了するのを待ってから、Finalizeルーチンを実行します。呼び出しの結果にAwait演算子を追加するよう警告を表示しています。私はこの権利をしていますか?ここに私のコードです:シンプルなC#Async Await - 非同期にプロセスリスト

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


async Task<int> processFiles() 
    { 
     int i = 0; 
     foreach (string fileName in listBox1.Items) 
     { 

       process(fileName); 
       i++; 

     } 
     return (i); 
    } 

async Task void process(string fileName) 
    { // 
     // read a CSV file into an SQL database 
    } 

private void btnSelectFiles_Click(object sender, EventArgs e) 
    { // get the files into the list box 
     string procesingDirectory = "C:\temp"; 
     FolderBrowserDialog FBD = new FolderBrowserDialog(); 
     FBD.SelectedPath = procesingDirectory; 
     FBD.Description = "Select Files"; 
     FBD.ShowNewFolderButton = false; 
     listBox1.Items.Clear(); 

     if (FBD.ShowDialog() == DialogResult.OK) 

     { 
      string[] files = Directory.GetFiles(FBD.SelectedPath); 
      Array.Sort(files); 
      foreach (string file in files) 
      { 
       if (file.IndexOf(".txt") > 0) 
       { 
        listBox1.Items.Add(file); 
       } 
       if (file.IndexOf(finder) > 0) 
       { 
        found = true; 
       } 
      } 
     } 
    }  
+0

downvoteとコメントは何ですか?私は時間をかけてこれを読んで何かを試して何時間も過ごしましたが、私はまだまだ立ち往生しています。それは助けのためではないですか? – Missy

答えて

1

あなたがプロセス方法で行われ、実際の非同期作業の詳細を提供していませんが、コンパイラがあなたのことを不平を言っているこの

async Task<int> processFiles() 
{ 
    var processingTasks = new List<Task>(); 
    foreach (string fileName in listBox1.Items) 
    { 
      processingTasks.Add(process(fileName)); 
    } 
    await Task.WhenAll(processingTasks); 
    return processingTasks.Count; 
} 

のようなものでなければなりませんので、わかりません非同期メソッドを使用していますが、非同期機能は使用していません。すべてのタスクが完了したら、再開したいと思うようです。実際のコードなしではまだ難しいです。現在の実装は、アプローチを忘れてしまい、タスクが完了するのを待っていません。これが必要な場合は、メソッドを同期させるだけで、プロセスメソッドが正しく実装されていれば非同期で実行されます。

+0

ニース!ありがとうございました。ですから、Awaitは非同期呼び出しと同じ方法でなければなりません。メソッドの前で – Missy

+1

asyncを実行すると、そのメソッドでawaitを使用することになります。今すぐ待つ必要があるのは、あなたが解決している問題に依存します。通常、何らかのIO(ファイルの読み取り/書き込み、データベースの呼び出し、Webサービスの呼び出し)が必要な操作を待っています。さらに、通常、非同期メソッドを呼び出すすべてのメソッドも非同期である場合があります。 – Stilgar

関連する問題