/ / Remplacer la méthode asynchrone par la version sync - des inconvénients? - c #, .net, http, méthodes, async-wait

Remplacer la méthode async par la version de synchronisation - inconvénients? - c #, .net, http, méthodes, async-wait

J'ai une méthode asynchrone pour mon application qui simplifie une requête HTTP pour mes besoins:

public async Task<string> MyAsyncMethod()
{
...

using (var httpResp = (HttpWebResponse)await req.GetResponseAsync().ConfigureAwait(false))
{
...

using (StreamReader reader = new StreamReader(
httpResp.GetResponseStream()))
{
return _response = await reader.ReadToEndAsync().ConfigureAwait(false);
}
}
}

Maintenant, je veux créer une méthode non asynchrone correspondante en réutilisant autant de code que possible.

Je pensais faire ce qui suit:

  • Méthode de réécriture à la méthode de synchronisation (utilisez GetResponse et ReadToEnd au lieu des méthodes async
  • Remplacer ResponseAsync () par une méthode faisant référence à la méthode sync

Mais cela signifierait que je pourrais abandonner ma méthode asynchroneet toujours utiliser ma méthode de synchronisation dans un contexte asynchrone, ce qui réduirait l’imbrication async (ce qui est bien). Je veux dire dans les deux cas, la même opération (par exemple, obtenir une réponse) est de toute façon effectuée dans un contexte asynchrone, quelle est la différence?

Réponses:

3 pour la réponse № 1

Mais cela signifierait que je pourrais abandonner ma méthode asynchronetout à fait et toujours utiliser ma méthode de synchronisation dans un contexte asynchrone, ce qui réduirait l'imbrication async (ce qui est bon). Je veux dire dans les deux cas la même opération (par exemple, obtenir une réponse) se fait quand même dans un contexte asynchrone

C'est incorrect. Si par "utiliser ma méthode de synchronisation dans un contexte asynchrone" vous voulez dire envelopper votre version synchrone avec Task.Run (qui est le anti-motif asynchrone sur synchronisation) alors ce n’est pas la même chose que d’utiliser une méthode vraiment asynchrone. Lorsque vous utilisez des méthodes asynchrones, vous êtes libérer le fil d'appel faire plus de travail pendant que l'opération asynchrone est en cours. Lorsque vous utilisez une version de synchronisation, vous faites "le contraire", vous êtes bloquer jusqu'à la fin de l'appel de cette méthode. Lorsque vous enveloppez une méthode de blocage avec Task.Run, vous utilisez réellement un autre fil juste pour bloquer à l'intérieur, parce que le délégué sera de votre version de synchronisation.

Note de côté: En utilisant HttpClient peut considérablement réduire la quantité de code dont vous avez besoin pour décharger une requête:

public Task<string> RequestAsync(string url)
{
var httpClient = new HttpClient();
return httpClient.GetAsStringAsync(url);
}

0 pour la réponse № 2

La différence est que async méthodes qui retournent Task reviendra immédiatement, (c’est-à-dire qu’on n’attendra pas que l’opération soit terminée à moins que vous ne spécifiiez explicitement avec await).

Donc, dans votre cas, votre méthode ne changera pas beaucoup, mais peut-être que le usage de votre méthode différera, car vous n'aurez pas besoin d'événements pour vous dire que l'exécution est terminée; le code continue à la fin.