[C#] ¿Cuál es el propósito de "return await" en C #?


Answers

Si no necesita la async (es decir, puede devolver la Task directamente), entonces no use async .

Hay algunas situaciones en las que el return await es útil, como si tuviera dos operaciones asincrónicas que hacer:

var intermediate = await FirstAsync();
return await SecondAwait(intermediate);

Para obtener más información sobre el rendimiento de async , consulte el artículo y el video MSDN de Stephen Toub sobre el tema.

Actualización: He escrito una publicación de blog que entra en mucho más detalle.

Question

¿Hay algún escenario donde escribir un método como este?

public async Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return await DoAnotherThingAsync();
}

en lugar de esto:

public Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return DoAnotherThingAsync();
}

tendría un sentido?

¿Por qué usar return await construcción cuando puede devolver directamente la Task<T> de la DoAnotherThingAsync() interna de DoAnotherThingAsync() ?

Veo el código con return await en tantos lugares, creo que debería haberme perdido algo. Pero por lo que entiendo, no usar palabras clave async / await en este caso y devolver directamente la tarea sería funcionalmente equivalente. ¿Por qué agregar una sobrecarga adicional de capa de await adicional?




Esto también me confunde y siento que las respuestas anteriores pasaron por alto su pregunta real:

¿Por qué utilizar return aguarice construir cuando puede devolver Tarea directamente desde la invocación DoAnotherThingAsync () interna?

Bueno, a veces quieres una Task<SomeType> , pero la mayoría de las veces realmente quieres una instancia de SomeType , es decir, el resultado de la tarea.

De tu código:

async Task<SomeResult> DoSomethingAsync()
{
    using (var foo = new Foo())
    {
        return await foo.DoAnotherThingAsync();
    }
}

Una persona que no Task<SomeResult> familiarizada con la sintaxis (yo, por ejemplo) podría pensar que este método debería devolver una Task<SomeResult> , pero dado que está marcado con async , significa que su tipo de devolución real es SomeResult . Si solo usa return foo.DoAnotherThingAsync() , estaría devolviendo una Tarea, que no se compilaría. La forma correcta es devolver el resultado de la tarea, por lo que la return await .




Otro caso que puede necesitar para esperar el resultado es este:

async Task<IFoo> GetIFooAsync()
{
    return await GetFooAsync();
}

async Task<Foo> GetFooAsync()
{
    var foo = await CreateFooAsync();
    await foo.InitializeAsync();
    return foo;
}

En este caso, GetIFooAsync() debe esperar el resultado de GetFooAsync porque el tipo de T es diferente entre los dos métodos y Task<Foo> no se puede Task<IFoo> directamente a Task<IFoo> . Pero si espera el resultado, simplemente se convierte en Foo que se puede IFoo directamente a IFoo . Luego, el método asíncrono simplemente Task<IFoo> a empaquetar el resultado dentro de la Task<IFoo> y listo.