J'écris une application fortement asynchronese. p>
Je cherche un moyen de faire la queue des appels, similaires à ce que Begininvoke / Endinvoke fait ... mais sur ma propre file d'attente. La Reqson est que j'ai mon propre système de file d'attente de messages optimisé à l'aide d'une threadpool, mais en vous assurant que chaque composant est un seul fileté dans les demandes (c'est-à-dire un thread ne gère que des messages pour un composant). P>
J'ai beaucoup de messages qui vont aller et venir. Pour une utilisation limitée, j'aimerais vraiment pouvoir simplement faire la queue un message d'appel avec des paramètres, au lieu de devoir définir mon propre paramètre, mon enveloppement de méthode / décalage uniquement dans le but de faire beaucoup d'appels d'adhonnaissance. Je ne veux pas non plus toujours contourner la file d'attente, et je ne veux absolument pas que le service d'envoi attendait que l'autre service réponde. P>
Quelqu'un sait un moyen d'intercepter un appel de méthode? Une manière à utiliser le proxy transparentproxy / virtuel pour cela? ;) ServiceDcomponent? J'aimerais que cela soit aussi peu de temps que possible;) p>
3 Réponses :
Que diriez-vous d'utiliser des lambdas?
Je veux dire, pourquoi ne créez-vous pas une certaine file d'attente et de les traiter de manière comme p> Vous pouvez ajouter des actions très simplement : p> Queue.Add( ()=>{ /* any code you wish here */})
TGHE Queuing n'est pas le problème;) J'en ai déjà un déjà et beaucoup de messages qui transportent des mises à jour de données. Mon problème sont des appels de fonction seulement. La file d'attente utilise ensuite une threadpool pour obtenir un fil de travailleur qui traite son contenu;) J'ai beaucoup de choses de mise à jour de données de processus croisées, maintenant, je cherche un moyen de faire la queue (en cours). Un type de message qui n'a pas de "données" mais un appel de fonction avec tous les paramètres, je peux donc utiliser des méthodes d'appel de base sur le service cible. Cela diminuerait de manière significative sur le nombre de messages différents dont j'ai besoin ...
Et je ne serais pas à proposer une déclaration de commutation élevée pour appeler différentes méthodes.
Puisque vous cherchez à la file d'attente des appels de méthode de processus, le passage de Lambdas semble être exactement ce que vous recherchez ...
La dynamicproxy qui fait partie du projet de château permet à l'interception des membres de l'objet sans une partie de la douleur grassiante typique p>
http://www.castleproject.org/projects/dynamicproxy/ p>
Vous pouvez utiliser ceci pour intercepter vos procédés et ensuite faire avec eux ce que vous voulez. P>
Créer une file d'attente de MethodInvoker's
public bool NextEvent(){ MethodInvoker bb = null; // this will hold the function prior to use if(EventCall.count > 0){ bb = EventCall.Dequeue(); //pull a method off of the queue bb(); //call the method you pulled off of the queue } else { MessageBox.Show("there was no event to call"); // this is optional, point being you should be handeling the fact that there is no events left in some way. } }