2016-11-20 2 views
-1

Bitte seien Sie freundlich zu mir, wie ich weiß, dass dieses Thema wiederholt aufgeworfen wurde. Ich kann mich einfach nicht darum kümmern. Ich habe einen wirklich einfachen Job: gehe durch eine Liste von Dateien und bearbeite jede einzelne. Warten Sie, bis alle fertig sind, und führen Sie dann eine Finalize-Routine aus. Ich erhalte eine Warnung, in der ich gefragt werde, ob ich einen Anrufer für den Anrufer hinzufügen soll. Mache ich das richtig? Hier ist mein Code:Simple C# Async Warten - Prozessliste asynchron

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

Was ist mit dem Downvote und keinen Kommentar? Ich habe Stunden damit verbracht, darüber zu lesen und verschiedene Dinge auszuprobieren, und ich bin immer noch festgefahren. Ist das nicht SO für Hilfe? – Missy

Antwort

1

Nicht sicher, da Sie bieten keine Details über die tatsächlichen async Arbeit im Prozess Methode gemacht, aber sollte so etwas wie dieses

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

Der Compiler sein, dass Sie beschweren verwenden die asynchrone Methode, verwenden jedoch nicht die asynchrone Funktion. Es scheint, dass Sie fortsetzen möchten, wenn alle Aufgaben erledigt sind. Noch immer schwer zu sagen ohne den eigentlichen Code. Ihre aktuelle Implementierung feuert und vergisst den Ansatz und wartet nicht auf die auszuführenden Aufgaben. Wenn dies gewünscht ist, können Sie die Methode einfach synchron machen und die Prozessmethode wird asynchron ausgeführt, wenn sie korrekt implementiert ist.

+0

Schön! Vielen Dank. Also sollte das Warten auf dieselbe Methode wie der Async-Aufruf sein? – Missy

+1

async vor der Methode zeigt an, dass Sie in dieser Methode "erwarten" verwenden werden. Nun hängt es von dem Problem ab, welches Sie lösen. In der Regel warten Sie auf Vorgänge, die eine Art von IO erfordern (Lesen/Schreiben von Dateien, Aufrufen einer Datenbank, Aufrufen eines Webdienstes). Darüber hinaus sind alle Methoden, die eine asynchrone Methode aufrufen, normalerweise asynchron. – Stilgar