L'imbrication async/await méthodes
Je suis en train d'écrire une bibliothèque qui encapsule un tiers appel de service web et suis en train de faire de la bibliothèque d'utiliser le nouveau async/await fonctionnalités. Qu'est-ce que la bonne utilisation de l'async/await mots-clés dans l'exemple suivant?
public class MyApi
{
public Task<ApiResult> DoSomethingAsync()
{
return this.DoSomethingCore();
}
public async Task<ApiResult> DoSomethingElseAsync()
{
return await this.DoSomethingCore();
}
private async Task<ApiResult> DoSomethingCore()
{
var httpClient = new HttpClient();
var httpResponseMessage = await httpClient.GetAsync("some url");
var rawResultText = await httpResponseMessage.Content.ReadAsStringAsync();
return new ApiResult(rawResultText);
}
}
Pour permettre à mon interlocuteur d'attendre la DoSomethingAsync méthode, cette méthode ont également la async et await mots-clés ajouté à cela? Ou est-il beau que-c'est parce qu'il renvoie à une Tâche? Est-il un meilleur modèle pour ce genre de nidification?
Je pense que le DoSomethingAsync méthode est la bonne façon d'aller ici, est-ce correct? Je crois DoSomethingElseAsync semble pas la bonne approche lors de la construction d'une bibliothèque.
La prochaine CLR est de 4,5, le lendemain de la langue est C#5
OriginalL'auteur Brian Vallelunga | 2012-08-02
Vous devez vous connecter pour publier un commentaire.
Tout
Task
peut être attendue, peu importe d'où il vient.Je ne suis pas sûr pourquoi
DoSomethingAsync
appelle justeDoSomethingCore
, depuisDoSomethingAsync
pourrait tout aussi facilement êtreasync
et l'utilisationawait
.Il y a aussi un règle générale que vous devez utiliser
ConfigureAwait(false)
dans la bibliothèque de méthodes.Edit: Si vous n'avez pas besoin d'utiliser
await
, alors ne faites pas la méthodeasync
.async
d'ajouter un peu de surcharge (vérifier Channel 9 pour Stephen Toub Zen de Async Performance vidéo). Si vous pouvez simplement retourner unTask
(commeDoSomethingAsync
), puis le faire de cette façon.J'ai ajouté un DoSomethingElseAsync() la méthode pour mieux expliquer ce que j'étais confus. Je crois que vous avez expliqué de manière satisfaisante et que le DoSomethingAsync() la méthode est la voie à suivre pour une méthode de bibliothèque.
OK. Voir mise à jour de réponse.
Donc, il faut la signature soit
public Task<ApiResult> DoSomethingElse()
et il suffit de renvoyerthis.DoSomethingCore();
? En gros, depuis que ce n'est pasawait
ing, il n'a pas besoin d'utiliser leasync
mot-clé, de sorte qu'il ne devrait pas besoin de nom de la méthodeDoSomethingElseAsync()
. Est-ce correct? C'est clairement pour clarifier les conventions de nommage et je sais que c'est pas syntaxique.Le
Async
suffixe est une convention qui transmet il est conçu pour être consommée parawait
, non pas que c'est mise en œuvre avecawait
. Donc, même siDoSomethingElseAsync
ne pas utiliserasync
/await
, il devrait toujours utiliser leAsync
suffixe.OriginalL'auteur Stephen Cleary
La formulation ci-dessous est fonctionnelle, mais sera probablement entraîner une augmentation des frais généraux (en raison d'avoir un secondaire de rappel pour les autres async/await méthode.)
Il est plus simple de retourner directement la Tâche, vous pouvez toujours attendre que la Tâche d'ailleurs sans avoir à la méthode mise en œuvre en tant que "asynchrone". Async/await est un peu comme les "taux de retour"; il ne certains compilateur de la magie pour mettre en œuvre le "rendement", mais l'énumération lui-même ne se soucie pas comment la mettre en œuvre. De même, un "attendent" l'appel ne se soucient pas comment les awaitable œuvres, tant que c'est awaitable.
OriginalL'auteur Dan Bryant