web-dev-qa-db-fra.com

Attendre vs Task.Result dans une méthode async

Quelle est la différence entre ce qui suit:

async Task<T> method(){
    var r = await dynamodb.GetItemAsync(...)
    return r.Item;
}

contre

async Task<T> method(){
    var task = dynamodb.GetItemAsync(...)
    return task.Result.Item;
}

Dans mon cas, pour une raison quelconque, seule la seconde fonctionne. Le premier ne semble jamais finir.

28
luis

await désynchronise de manière asynchrone le résultat de votre tâche, alors que le simple fait d'utiliser Result bloquerait jusqu'à ce que la tâche soit terminée.

Voir cette explication de Jon Skeet.

41
Frank Fajardo

task.Result accède à l'accesseur get de la propriété bloque le thread appelant jusqu'à la fin de l'opération asynchrone. cela revient à appeler la méthode Wait . Une fois que le résultat d’une opération est disponible, il est stocké et renvoyé immédiatement lors des appels suivants à la propriété Result. Notez que si une exception s'est produite lors de l'opération de la tâche ou si la tâche a été annulée, la propriété Result ne renvoie pas de valeur. Au lieu de cela, tenter d'accéder à la valeur de la propriété lève une exception AggregateException. La seule différence est que l'attente ne bloquera pas. Au lieu de cela, il attend de manière asynchrone que la tâche se termine, puis reprend

12
NASSER