Créer une méthode asynchrone dans .NET 4.0 pouvant être utilisée avec “wait” dans .NET 4.5

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

Ce que je voudrais faire, c’est append des surcharges asynchrones à ma bibliothèque pour faciliter la programmation asynchrone pour les utilisateurs de .NET 4.5 avec le mot-clé wait. En ce moment, les méthodes en surcharge sont non asynchrones. Je ne veux pas non plus utiliser de méthodes asynchrones moi-même, il suffit d’en créer de nouvelles et de les rendre disponibles.

Est-ce que créer des méthodes asynchrones dans .NET 4.0 et VS2010 est possible et si oui, à quoi devrait ressembler la méthode async .NET 4.0?

Comme j’utilise VS2010, je n’ai pas access au mot-clé “async”. Que doit-il se passer pour émuler ce comportement dans .NET 4.0? Par exemple, faut-il renvoyer un type particulier et faut-il que du code apparaisse dans la méthode pour que le code actuellement non asynchrone qu’il appelle se produise de manière asynchrone?

Comme d’autres l’ont déclaré, vous commencez par avoir une méthode return Task ou Task . Ceci est suffisant pour await son résultat dans .NET 4.5.

Pour que votre méthode s’intègre aussi bien que possible avec le futur code asynchrone, suivez les instructions du document Modèle asynchrone basé sur des tâches (également disponible sur MSDN ). Il fournit des conventions de dénomination et des recommandations de parameters, par exemple pour prendre en charge l’annulation.

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

  • Si vous avez des méthodes asynchrones basées sur IAsyncResult , utilisez Task.Factory.FromAsync .
  • Si vous avez un autre système asynchrone, utilisez TaskCompletionSource .

La méthode la plus simple consiste à renvoyer une Task ou une Task . Ce sera suffisant.

Cependant, cela n’a de sens que si votre méthode s’exécute vraiment de manière asynchrone.

Je vous recommande également de suivre le schéma habituel de les nommer 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).

Astuce: append simplement une async à la méthode ne fait rien. Votre méthode s’exécutera séquentiellement et renverra une tâche terminée. Si la méthode retourne une tâche, elle doit servir un certain objective: en général, la méthode est exécutée de manière asynchrone (comme un appel de service Web ou un fichier IO).

Si votre méthode ne contient que des calculs, mais pas d’IO (ou ne bloque que des IO), il est généralement préférable de ne pas la rendre asynchrone car vous ne 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 approfondir un peu ce sujet.

Tant que vous retournez une tâche qui se termine d’une manière ou d’une autre (que ce soit dans un thread ou de manière asynchrone), vous devez prendre en charge le modèle asynchrone.

Avoir une tâche exécutée de manière asynchrone est une autre histoire. Si vous aviez access 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 le faire, mais la manière la plus élégante de voir (et d’utiliser) est d’utiliser System.Threading.Tasks.TaskCompletionSource pour construire une tâche, utiliser le modèle Begin / End de méthodes asynchrones pour exécuter tout ce dont vous avez besoin. éxécuter. Ensuite, lorsque vous avez le résultat sous la main, publiez-le sur l’instance de Task précédemment construite à l’aide de votre source d’achèvement.

Ce sera certainement asynchrone, mais pas aussi sophistiqué que dans la prochaine version.

Disclaimer: Je ne suis pas près d’un expert à ce sujet. Je viens juste de faire quelques expériences.