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?
}
Stream.ReadAsync()
in einem Verfahren, das Verfahren selbst asynchron sein sollte, und kehrt ein , Task<T>
wo T
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 Basiswert Stream.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.
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.