Okay, schlechter Titel, aber mir fiel kein besserer ein... Meine Frage ist wahrscheinlich nicht einmal spezifisch für async/await, aber meine Frage tritt während der Async-Behandlung auf, also werde ich sie so stellen:
Ich habe mehrere Methoden, die Listen von Aufgaben erstellen und dann ein 'await Task.WhenAll(Liste von Aufgaben)'. Der spezifische Typ von Aufgaben, auf die in diesen Methoden gewartet wird, variiert. Zum Beispiel warten einige Methoden auf eine Liste von Task
, während andere auf eine Liste von Task
warten.
Was ich feststelle, ist, dass ich in jedem dieser Methoden um die Task.WhenAll() herum einige nicht triviale try/catch-Verarbeitung machen muss und dieser Code immer gleich ist. Ich möchte diesen Code in eine gemeinsame Methode verschieben und dann die Liste von Aufgaben übergeben und diese gemeinsame Methode dann im try/finally ausführen lassen.
Aber das Problem, dem ich begegne, ist, dass jede der Methoden, die diese Methode aufrufen, Listen von unterschiedlichen Task-Typen übergeben werden, und das führt dazu, dass der Compiler meckert, wenn ich den Parameter für meine gemeinsame Methode als einfachen Task deklariere:
methodA:
List> meineAufgabenliste = ...
ExecuteTasks(meineAufgabenliste);
methodB:
List> meineAufgabenliste = ...
ExecuteTasks(meineAufgabenliste);
async Task ExecuteTasks(List taskList) {
try {
await Task.WhenAll(taskList)
}
catch {
..gemeinsame Fehlerbehandlung erfolgt hier. Diese Behandlung ist nicht wirklich sensibel für den
..Typ der Aufgaben, wir müssen nur deren Status und Ausnahmeeigenschaften überprüfen..
}
}
In obigem Beispiel müssen MethodeA und MethodeB jeweils ihre eigenen Arten von Aufgabenlisten an ExecuteTasks übergeben, aber die Frage ist, wie man die Liste von Aufgaben für ExecuteTasks definiert, so dass der Compiler sich nicht über Typenunstimmigkeiten beschwert. In einer nicht-generischen Welt würde ich wahrscheinlich den Parameter für ExecuteTasks als Superklasse der Typen von MethodeA und MethodeB definieren, damit der Compiler sie "upcasten" könnte, aber dieser Ansatz scheint hier nicht zu funktionieren.. (Ich habe versucht, ExecuteTasks als Task zu definieren, aber das hat das Typenproblem nicht gelöst)