Domanda

Sono stato nuovo al metodo async-await in C# 5.0, e ho poche domande nella mia mente

    .
  1. Qual è il modo migliore per sfuggire a un metodo async se ha fallito un argomento di input o un controllo nullo?

  2. Qual è il flusso logico dell'utilizzo di return; in un metodo async dell'attività (in alcune circostanze, è diventato un ciclo infinito)?

  3. è CancellationToken o Task.Yield adatta meglio in questo scenario?

  4. 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);
    }
    
    .

È stato utile?

Soluzione

Il modo migliore per "fallire su un problema", IMHO sarebbe quello di lanciare l'eccezione appropriata, ma puoi assolutamente usare return; se preferisci evitare eccezioni.

Creererà un'attività completata / guastata che è stata completata in modo sincrono, quindi il chiamante utilizzando await otterrà un'attività finita e continuerà a utilizzare lo stesso thread.


.
    .
  • CancellationToken consente il chiamante per annullare l'operazione, che non è il caso che si descrive.

  • Task.Yield non termina alcuna operazione, consente solo ad altre attività di funzionare per un po 'di tempo e riprogramme per dopo.

Altri suggerimenti

È possibile tornare in sicurezza da un metodo ASYNC in qualsiasi momento.Nel tuo caso (metodo che restituisce un'attività) Il compilatore genererà un'attività terminata, quindi qualsiasi chiamante in attesa della funzione continuerà.

Quando si getta un'eccezione da un metodo async viene catturato nell'attività in modo da non essere lanciato fino a quando non viene osservato l'attività chiamando Task.Wait(), Task.Result, in attesa dell'attività o nell'accesso alla proprietà Exceptions dell'attività.

In termini di argomenti di ingresso un modo per andare in giro è quello di dividere il metodo in due parti, il primo controlla gli argomenti di ingresso e quindi chiamano il secondo metodo che è async.Vedi Questa Domande Risposta di Stephen Cleary per un esempio.In questo modo l'eccezione dell'argomento di input verrà gettato direttamente al di fuori del compito restituito dal metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top