C# – So unterbrechen Sie eine Async/await-Kette, wenn Sie etwas aufrufen, das nicht asynchron ist

C# – So unterbrechen Sie eine Async/await-Kette, wenn Sie etwas aufrufen, das nicht asynchron ist

Ich habe mich manchmal selbst gefunden - am Ende einer langen Kette von async/await -, die etwas anruft, das async nicht verwendet. Manchmal haben Sie am Ende Ihres Aufrufstapels einen Mapper oder eine andere synchrone Operation. Hier habe ich mangels besserer Lösung Task.FromResult.

verwendet

Nehmen wir an, Sie haben eine Methode wie die folgende:

public async Task<PersonDTO> MapPersonDTO(PersonEntity personEntity)
{
   return await _personMapper.Map(personEntity);
}

Oft finden Sie, dass eine Mapper-Klasse (personMapper) wie die obige synchrone Operationen hat - da es normalerweise darum geht, einige Eigenschaften von einem Objekt zu einem anderen zu verschieben. Die Klasse könnte wie folgt aussehen:

public PersonDTO Map(PersonEntity personEntity)
{
    return new PersonDTO
    {
        Name = personEntity.Name,
        LastName = personEntity.LastName
    };
}

Eine einfache Zuordnung von einem Entitätsobjekt zu einem DTO. Das Obige ist jedoch in keiner Weise synchron. Die beiden obigen Codeteile würden also einen Kompilierungsfehler verursachen. Die einzige Problemumgehung, die ich dafür gefunden habe, besteht darin, Task.FromResult zu verwenden, um das zurückgegebene DTO in eine abgeschlossene Aufgabe einzuschließen. Dies ist unten zu sehen:

public static async Task<PersonDTO> MapPersonDTO(PersonEntity personEntity)
{
    return await Task.FromResult(_personMapper.Map(personEntity));
}

Der obige Code funktioniert, aber er fühlt sich schmutzig an. Es besteht auch das Problem, dass dadurch Ausnahmen in aggregierte Ausnahmen eingeschlossen werden, die Sie entpacken müssen.

Aber wann sollte die Methode Task.FromResult verwendet werden? MSDN gibt an, dass „diese Methode nützlich ist, wenn Sie eine asynchrone Operation ausführen, die ein Task-Objekt zurückgibt, und das Ergebnis dieses Task-Objekts bereits berechnet wurde.“ ". Daher ist es für dieses Szenario etwas relevant. Es gibt auch mehrere Leute bei Stack Overflow, die einige Szenarien für diese Methode erwähnen.

Also benutze ich jetzt Task.FromResult dafür. Lassen Sie mich in den Kommentaren unten wissen, ob Sie eine bessere Lösung haben :)