Devrais-je attendre ReadAsSsortingngAsync () si j’attendais la réponse sur laquelle j’exécute ReadAsSsortingngAsync ()?

Devrais-je attendre ReadAsSsortingngAsync() si j’attendais la réponse sur laquelle ReadAsSsortingngAsync() ? Pour clarifier davantage, quelle est la différence ou la bonne manière entre ce qui suit? Sont-ils effectivement les mêmes?

 var response = await httpClient.GetAsync("something"); var content = await response.Content.ReadAsSsortingngAsync(); return new AvailableViewingTimesMapper().Map(content); 

OU

 var response = await httpClient.GetAsync("something"); var content = response.Content.ReadAsSsortingngAsync(); return new AvailableViewingTimesMapper().Map(content.Result); 

Votre premier exemple est le bon. Le deuxième exemple ne cède pas pendant l’opération asynchrone. Au lieu de cela, en obtenant la valeur de la propriété content.Result , vous forcez le thread en cours à attendre que l’opération asynchrone soit terminée.

En outre, comme le souligne Scott Chamberlain, en bloquant le fil de discussion actuel, il est possible d’introduire la possibilité d’un blocage. Cela dépend du contexte, mais un scénario courant pour await consiste à utiliser cette instruction dans le thread d’interface utilisateur. Le thread d’interface utilisateur doit restr réactif pour une variété de besoins, tout en permettant notamment de gérer l’achèvement d’une opération attendue. .

Si vous évitez le second modèle, c.-à-d. Que vous récupérez la valeur de la propriété Result d’une Task vous ne savez pas encore terminée, vous pouvez non seulement assurer une utilisation efficace de vos threads, mais également éviter ce piège commun.

ReadAsSsortingng est une méthode async ReadAsSsortingng que la lecture des données est en réalité une opération IO. Le contenu peut simplement ne pas être entièrement chargé même si vous avez déjà le résultat http. Il n’y a pas de threads supplémentaires ou de grandes charges informatiques impliqués.

HttpClient.GetAsync vous permet d’append une HttpCompletionOption pour que GetAsync ne soit GetAsync qu’une fois que l’ensemble de HttpResult a été chargé. Dans ce cas, HttpContent.ReadAsSsortingngAsync se terminera de manière synchrone (ce que l’on appelle fastpath) car le contenu existe déjà.

Donc, vous devriez certainement l’attendre.

En outre: comme il s’agit probablement d’un code de bibliothèque qui ne dépend pas du renvoi au niveau du thread d’interface utilisateur, vous devez append .ConfigureAwait(false) à tous les appels de méthode en attente.

Voici le code source .NET pour ReadAsSsortingngAsync . Si vous regardez plus en profondeur dans la méthode LoadIntoBufferAsync (), vous verrez que cela continuera à lire le tampon à partir de HttpResponse et mènera à un appel réseau potentiel supplémentaire. Cela signifie que c’est une bonne pratique d’utiliser wait à la place de Result.

 [__DynamicallyInvokable] public Task ReadAsSsortingngAsync() { this.CheckDisposed(); TaskCompletionSource tcs = new TaskCompletionSource(); HttpUtilities.ContinueWithStandard(this.LoadIntoBufferAsync(), (Action) (task => { if (HttpUtilities.HandleFaultsAndCancelation(task, tcs)) return; if (this.bufferedContent.Length == 0L) { tcs.TrySetResult(ssortingng.Empty); } else { Encoding encoding1 = (Encoding) null; int index = -1; byte[] buffer = this.bufferedContent.GetBuffer(); int dataLength = (int) this.bufferedContent.Length; if (this.Headers.ContentType != null) { if (this.Headers.ContentType.CharSet != null) { try { encoding1 = Encoding.GetEncoding(this.Headers.ContentType.CharSet); } catch (ArgumentException ex) { tcs.TrySetException((Exception) new InvalidOperationException(SR.net_http_content_invalid_charset, (Exception) ex)); return; } } } if (encoding1 == null) { foreach (Encoding encoding2 in HttpContent.EncodingsWithBom) { byte[] preamble = encoding2.GetPreamble(); if (HttpContent.ByteArrayHasPrefix(buffer, dataLength, preamble)) { encoding1 = encoding2; index = preamble.Length; break; } } } Encoding encoding3 = encoding1 ?? HttpContent.DefaultSsortingngEncoding; if (index == -1) { byte[] preamble = encoding3.GetPreamble(); index = !HttpContent.ByteArrayHasPrefix(buffer, dataLength, preamble) ? 0 : preamble.Length; } try { tcs.TrySetResult(encoding3.GetSsortingng(buffer, index, dataLength - index)); } catch (Exception ex) { tcs.TrySetException(ex); } } })); return tcs.Task; }