Pregunta

yo era nuevo en el async-await método en C# 5.0, y tengo algunas preguntas en mente

  1. ¿Cuál es la mejor manera de escapar de un async método si falló un argumento de entrada o una verificación nula?

  2. ¿Cuál es el flujo lógico de uso? return; en una tarea async método (en algunas circunstancias, se convirtió en un bucle infinito)?

  3. Es CancellationToken o Task.Yield ¿Encaja mejor en este escenario?

public Func<AzureBlobInfo, string, Task> UploadSuccessCallBackAsync { get; set; }

private async Task OnUploadSuccessAsync(AzureBlobInfo info)
{
    if (this.UploadSuccessCallBackAsync == null)
    {
        return;
    }

    var transactionType = this.FormData.Get("transactionType");
    if (string.IsNullOrEmpty(transactionType))
    {
        transactionType = "unknown";
    }

    await this.UploadSuccessCallBackAsync(info, transactionType);
}
¿Fue útil?

Solución

La mejor manera de "fallar en un problema", IMHO sería lanzar la excepción apropiada, pero definitivamente puede usar return; si prefiere evitar excepciones.

Esto creará una tarea completada / falla que se completó de forma sincrónica, por lo que la persona que llama usando await obtendrá una tarea terminada y continuará utilizando el mismo hilo.


  • CancellationToken permite la persona que llama cancelar la operación, que no es el caso que está describiendo.

  • Task.Yield no termina ninguna operación, solo permite que otras tareas se ejecuten durante algún tiempo y reprochuradas en sí para más tarde.

Otros consejos

Puede regresar de forma segura de un método de ASYNC en cualquier momento.En su caso (método que devuelve una tarea), el compilador generará una tarea terminada, por lo que cualquier persona que se espera que se espere en su función continuará.

Al lanzar una excepción desde un async método se captura en la tarea para que no se lance hasta que se observe la tarea llamando Task.Wait(), Task.Result, esperando la tarea o accediendo al Exceptions propiedad de la tarea.

En términos de argumentos de entrada, una forma de solucionarlo es dividir el método en dos partes, la primera verifica los argumentos de entrada y luego llama al segundo método, que es async.Ver este preguntas respondidas por Stephen Cleary como ejemplo.De esa manera, la excepción del argumento de entrada se generará inmediatamente fuera de la tarea devuelta por el método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top