Da es sich bei C# 's Task um eine Klasse handelt, können Sie Task<TDerived>
natürlich nicht in eine Task<TBase>
umwandeln.Wie konvertiert man eine Aufgabe <TDerived> in eine Aufgabe <TBase>?
Allerdings können Sie tun:
public async Task<TBase> Run() {
return await MethodThatReturnsDerivedTask();
}
Gibt es eine statische Aufgabe Methode, die ich anrufen kann eine Task<TDerived>
Instanz zu erhalten, die im Wesentlichen nur Punkte auf die zugrunde liegende Aufgabe und wirft das Ergebnis? Ich möchte etwas wie:
public Task<TBase> Run() {
return Task.FromDerived(MethodThatReturnsDerivedTask());
}
Gibt es eine solche Methode? Gibt es einen Overhead für die Verwendung einer asynchronen Methode ausschließlich für diesen Zweck?
Warum nicht einfach 'Rückkehr MethodThatReturnsDerivedTask() ContinueWith (task => (TBase) task.Result, TaskContinuationOptions .ExecuteSynchronously) '? –
Wenn Sie 'Result' verwenden, werden Sie alle Ausnahmen in eine' AggregateException' umbrechen und einen Fehler erzeugen, wenn die ursprüngliche Aufgabe in einem abgebrochenen Zustand abgeschlossen wurde.Das heißt, mit etwas mehr Code, um diese Situationen richtig zu behandeln, könnten Sie eine funktionierende Lösung mit 'ContinueWith' ohne 'TaskCompletionSource' erstellen. –