Ein paar Hintergrundinformationen.
Ich lerne den Web-API-Stack und versuche, alle Daten in Form eines "Ergebnis" -Objekts mit Parametern wie Success und ErrorCodes zu kapseln.
Unterschiedliche Methoden würden jedoch unterschiedliche Ergebnisse und Fehlercodes erzeugen, aber das Ergebnisobjekt würde im Allgemeinen auf dieselbe Weise instanziiert.
Um Zeit zu sparen und mehr über Async / Wait-Funktionen in C # zu erfahren, versuche ich, alle Methodenkörper meiner Web-API-Aktionen in einen asynchronen Aktionsdelegierten zu packen, bin aber in einen kleinen Haken geraten ...
Angesichts der folgenden Klassen:
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
Ich möchte eine Methode schreiben, die eine Aktion für ein Ergebnisobjekt ausführt, und diese zurückgeben. Normalerweise wäre es durch synchrone Methoden
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Aber wie kann ich diese Methode mit async / await in eine asynchrone Methode umwandeln?
Folgendes habe ich versucht:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody)
where T: Result, new()
{
// But I don't know what do do from here.
// What do I await?
}
quelle
new
-ing bis dieT
, warum Ihre Notwendigkeit Methode asynchron sein? AFAIK in Code mit asynchronen APIs müssen Sie nur dieasync
Ness von anderen Methoden, die Sie verwenden, weitergeben.Stream.ReadAsync()
in einem Verfahren, das Verfahren selbst asynchron sein sollte, und kehrt ein ,Task<T>
woT
ist das, was man die Methode synchron waren zurückgekehrt ist. Die Idee ist, dass auf diese Weise jeder Aufrufer Ihrer Methode "asynchron warten" kann (ich weiß nicht, was ein guter Begriff dafür ist), bis der BasiswertStream.ReadAsync()
vollständig ist. Eine Metapher dafür, die Sie verwenden können, ist, dass Async "ansteckend" ist und sich von integrierten E / A auf niedriger Ebene in anderen Code ausbreitet, dessen Ergebnisse von denen dieser E / A abhängen.Antworten:
Das
async
Äquivalent vonAction<T>
istFunc<T, Task>
, also glaube ich, dass dies das ist, wonach Sie suchen:quelle
void
Methode ist eineTask
Rückgabemethode. Somit ist das asynchrone Äquivalent vonAction
isFunc<Task>
und das asynchrone Äquivalent vonAction<T>
isFunc<T, Task>
. Mehr Infos hier .Task
wenn sie keinen Rückgabewert hat. Wenn dasasync
Schlüsselwort verwendet wird, wird die tatsächlicheTask
Instanz von einer Zustandsmaschine erstellt, nicht von der Funktion direkt.Ich glaube, der Weg, dies umzusetzen, ist:
quelle
Task.Run
(und noch mehrStartNew
).