2017-03-28 5 views
4

Kürzlich stieß ich auf ein Problem beim Aufrufen der asynchronen Methode. Hier ist der Code:Asynchrone Methode C# WhenAll Ausgabe

ClassA storage = new ClassA();// this is member of the class 

async Task<ClassA> InitClassAObject(){ // async method of the class 


    List<Task> taskList = new List<Task>(); // create list task 
     taskList.Add(Func1()); 
     taskList.Add(Func2()); 
     taskList.Add(Func3());    

     await Task.WhenAll(taskList.ToArray()); // wait for all task done 

     return storage; // <--- this line never be hit 
} 

async Task Func1(){ 
     await Task.Run(() =>{ 
      //update property A of storage 
      //example storage.A = GetDataFromSomeWhere(); 
    }); 
} 

async Task Func2(){ 
     await Task.Run(() =>{ 
      //update property B of storage 
      //example storage.B = GetDataFromSomeWhereElse(); 
    }); 
} 
... 

Frage 1: Die Methode InitClassAObject() nie zurückgibt. Haltepunkt bei "Return nie".

Frage 2: Wenn ich mehrere asynchrone Methode aufrufen und sie verschiedene Eigenschaften des Objekts ClassA aktualisieren. Ist das sicher?

Ich habe nach einer Lösung gesucht, aber immer noch nicht gefunden. Danke.

+2

Vielleicht werden alle Aufgaben nie abgeschlossen? – Magnus

+2

Haben Sie getestet, was 'Func1',' Func2' und 'Func3' machen? Wenn 'return storage' _never_ geschlagen wird, dann wahrscheinlich, weil mindestens eine dieser Aufgaben nicht abgeschlossen ist. –

+0

Danke für Ihren Kommentar. Dies funktioniert, wenn ich synchron Func1() aufrufe; Funct2(); .. Dann wechsle ich zu diesem Ansatz und es funktioniert nicht mehr. Dann nehme ich an, dass mit diesen Funktionen nichts falsch ist. Ich werde sie jedoch nochmals verifizieren. –

Antwort

2

Über Frage 2: Es ist sicher, verschiedene Eigenschaften zu aktualisieren. Aber Sie sollten daran denken, dass, wenn Sie SomeProperty in Task1 lesen und es in Task2 ändern, das Ergebnis unvorhersehbar ist (Task1 kann vor oder nach Task2 schreiben)

+0

Vielen Dank. Ich werde mich erinnern. –

3

Funktionen verwenden dieselbe Quelle (Objekt), weil das Deadlock verursachen kann? Kannst du bitte nicht das gleiche Objekt verwenden und das Ergebnis sehen?

+0

Vielen Dank für Ihre Antwort. Ich habe festgestellt, dass einer meiner Code nicht abgeschlossen wurde. Übrigens, obwohl es jetzt funktioniert, habe ich immer noch Angst, dass das asynchrone Ändern (unterschiedliche Eigenschaften) des Objekts Probleme verursachen kann. –