8
votes

Agent / MailboxProcesseur en C # à l'aide de nouveaux asynchronisations / attendre

cette question combine deux sujets que je ne comprends pas complètement

lire via un PAPIER À propos de ASYNC dans F #, je suis tombé sur le thème des agents / boîtes aux lettresProcesseurs, qui peuvent être utilisés pour mettre en œuvre des machines à états réactifs. La nouvelle fonctionnalité Async / attendre le C # 5 pourrait-elle être utilisée pour mettre en œuvre quelque chose de similaire dans C # ou existe-t-il déjà quelque chose d'analogue qui serait mieux adapté?


2 commentaires

Pourriez-vous réparer le lien brisé?


@CZIFRO, OK FAIT.


3 Réponses :


3
votes

En principe, je m'attends à ce qu'il soit simple de traduire ces API F # en c # -plus-async-attendre.

En pratique, je ne suis pas clair si cela sortirait de beaux annotations de type extra et pleines d'annotations supplémentaires, ou simplement non-idiomatique et ayant besoin d'un massage de l'API pour le faire sentir plus à la maison en C #. Je pense que le jury est sorti jusqu'à ce que quelqu'un fasse le travail et l'essaie. (Je suppose qu'il n'y a pas de tel échantillon dans l'attente CTP.)


3 commentaires

Téléchargé le CTP. Maintenant, je vais procéder à élargir mon ignorance en essayant :)


Je vois que votre super échappée l'a fait dans les échantillons, félicitations :)


Aie! Trop difficile pour moi ce genre de choses :(



11
votes

Avec un peu de piratage assez horrible, vous pouvez utiliser le type MailboxProcessor de C # en utilisant async . Certaines difficultés sont que le type utilise certaines fonctionnalités spécifiques F # (les arguments facultatifs sont des options, les fonctions sont des fonctions FSHARPFUNCUNC TYPE, etc.)

Techniquement, la plus grande différence est que f # ASYNC est désactivé pendant que c # async crée une tâche qui fonctionne déjà. Cela signifie que pour construire F # ASYNC de C #, vous devez écrire une méthode qui prend TR /> Tâche et crée async . J'ai écrit un publication de blog qui décrit la différence .

anwyay, si vous voulez Pour expérimenter, voici un certain code que vous pouvez utiliser: xxx

comme vous pouvez le voir, cela a l'air vraiment horrible :-).

  • En principe, il pourrait être possible d'écrire une enveloppe conviviale C # pour le type MailboxProcessor (extraire simplement les bits laids de ce code), mais il y a quelques problèmes.

  • en F # Vous utilisez souvent des asynchronis à la queue pour mettre en œuvre la machine à états dans le processeur de la boîte aux lettres. Si vous écrivez la même chose en C #, vous obtiendrez éventuellement Stackoverflow , vous devez donc écrire des boucles avec un état mutable.

  • Il est parfaitement possible d'écrire l'agent en F # et de l'appeler de C #. Ceci est juste une question d'exposition de l'interface c #ielle de F # (à l'aide de la méthode async.startastask ).


3 commentaires

Ouch, mes yeux :) La tâche -> Async était précisément le bit que je suis resté coincé, alors je vais regarder cela. Que diriez-vous de réécrire un processeur de boîtes aux lettres en C # ou ne valez-t-il pas simplement l'effort à cause de votre deuxième point de balle sur la récursion?


@Benjol - J'ai écrit un type similaire en C #. C'était environ 300 lignes de code. La différence étant une API simplifiée.


@Benjol: Je pense que la réécriture de la boîte aux lettres de la boîte aux lettres en C # serait une option aussi. Il n'est pas facile d'obtenir le droit de verrouillage et de synchronisation (en particulier pour tryscan méthode), mais je pense que cela devrait fonctionner (vous pouvez toujours éviter la récursion, mais dans le cas de machines d'état Le code a l'air assez mauvais, il est donc regrettable si c'est ce que les utilisateurs doivent écrire)



0
votes

Vous pourriez ne pas regarder regarder Stack . Il n'a pas été mis à jour dans un peu de temps, mais si vous vouliez faire quelque chose avec un petit support C #, vous pourriez le trouver un bon point de départ. Je ne pense pas que ce soit à jour avec async / attendre, cependant.


0 commentaires