41 votes

Création d'une méthode asynchrone dans .NET 4.0 qui peut être utilisée avec "await" dans .NET 4.5

J'ai un projet .NET qui utilise C# dans .NET 4.0 et VS2010.

J'aimerais ajouter des surcharges asynchrones à ma bibliothèque afin de faciliter la programmation asynchrone pour les utilisateurs de .NET 4.5 avec le mot-clé await. Actuellement, les méthodes qui sont surchargées sont non asynchrones. De plus, je ne veux pas utiliser moi-même de méthodes asynchrones, mais simplement en créer de nouvelles et les rendre disponibles.

Est-il possible de créer des méthodes asynchrones dans .NET 4.0 et VS2010 et, si oui, à quoi devrait ressembler la méthode asynchrone de .NET 4.0 ?

Comme j'utilise VS2010, je n'ai pas accès au mot-clé "async". Que faut-il faire pour émuler ce comportement dans .NET 4.0 ? Par exemple, faut-il que la méthode renvoie un type particulier, et faut-il que du code se produise à l'intérieur de la méthode pour que le code actuellement non asynchrone qu'elle appelle se produise de manière asynchrone ?

32voto

Stephen Cleary Points 91731

Comme d'autres l'ont dit, il faut commencer par avoir une méthode de retour. Task ou Task<TResult> . Ceci est suffisant pour await son résultat dans .NET 4.5.

Pour que votre méthode s'intègre le mieux possible dans le futur code asynchrone, suivez les directives de l'outil de gestion de l'information de la Commission européenne. Document sur le modèle asynchrone basé sur les tâches (également disponible sur MSDN ). Il fournit des conventions d'appellation et des recommandations de paramètres, par exemple pour la prise en charge de l'annulation.

Pour la mise en œuvre de votre méthode, vous avez quelques choix :

9voto

usr Points 74796

La façon la plus simple de procéder est de renvoyer un fichier de type Task ou un Task<T> . Cela suffira.

Toutefois, cela n'a de sens que si votre méthode s'exécute réellement de manière asynchrone.

Je vous recommande également de suivre le modèle habituel en les nommant comme AbcAsync (suffixe "Async"). Vos appelants ne remarqueront aucune différence avec une méthode asynchrone créée avec C# 5 (car il n'y en a pas).

Conseil : Le simple fait d'ajouter async à la méthode ne change rien. Votre méthode s'exécutera séquentiellement et renverra une tâche terminée. Faire en sorte que la méthode renvoie une tâche doit servir un certain objectif - généralement, cela est fait parce que la méthode s'exécute de manière asynchrone (comme un appel de service web ou une entrée/sortie de fichier).

Si votre méthode ne contient que des calculs mais pas d'entrées/sorties (ou seulement des entrées/sorties bloquantes), il est généralement préférable de ne pas la rendre asynchrone, car vous n'y gagnez rien. Les méthodes asynchrones ne s'exécutent pas toujours sur un thread séparé. Si cette dernière phrase vous a surpris, vous voudrez peut-être creuser un peu plus ce sujet.

3voto

Ekin Koc Points 1752

Tant que vous renvoyez une tâche qui se termine d'une manière ou d'une autre (que ce soit dans un fil ou de manière asynchrone), vous prenez en charge le modèle asynchrone

L'exécution asynchrone d'une tâche est une autre histoire. Si vous aviez accès au mot-clé async et à l'API, vous pourriez simplement baser votre méthode sur des appels asynchrones à d'autres méthodes asynchrones déjà fournies. Mais dans ce cas, vous devez créer vos tâches asynchrones à la main.

Il y a peut-être de meilleures façons de procéder, mais la façon la plus élégante que je vois (et que j'ai utilisée) est d'utiliser la fonction System.Threading.Tasks.TaskCompletionSource pour construire une tâche, utilisez Begin / End de méthodes asynchrones pour exécuter tout ce que vous avez besoin d'exécuter. Ensuite, lorsque vous avez le résultat en main, vous l'envoyez à l'objet précédemment construit, le Task en utilisant votre source d'achèvement.

Il sera certainement asynchrone, mais pas aussi sophistiqué que ceux de la prochaine version.

Avis de non-responsabilité : Je ne suis pas du tout un expert en la matière. J'ai juste fait quelques expériences.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X