wake-up-neo.net

Wie implementieren Sie eine asynchrone Aktionsdelegierungsmethode?

Eine kleine Hintergrundinformation.

Ich lerne den Web-API-Stack und versuche, alle Daten in Form eines "Result" -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 die gleiche Weise instanziiert.

Um etwas Zeit zu sparen und mehr über die Async/Warten-Funktionen in C # zu erfahren, versuche ich, alle Methodentexte meiner Web-API-Aktionen in einen Delegaten für asynchrone Aktionen zu packen, der sich jedoch in einem Haken verfangen hat ...

Bei 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 Result-Objekt ausführt und diese zurückgibt. Normalerweise würde es durch synchrone Methoden sein

public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
    T result = new T();
    resultBody(result);
    return result;
}

Aber wie wandle ich diese Methode mit async/await in eine asynchrone Methode um?

Das 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?
}
109
Albin Anke

Das async Äquivalent von Action<T> ist Func<T, Task>, also ich glaube das ist was du suchst:

public async Task<T> DoSomethingAsync<T>(Func<T, Task> resultBody)
    where T : Result, new()
{
  T result = new T();
  await resultBody(result);
  return result;
}
247
Stephen Cleary