2011-04-27 1 views
1

Je voudrais reformuler ma question précédente How to create Singleton with async method?comment créer un singleton qui tourne toujours dans un fil séparé?

Imaginez application de messagerie (comme icq) - quelque chose qui devrait être toujours connecté au serveur et peut envoyer des messages.

Je dois implémenter la classe Connection. Il devrait être singleton, car il contient "socket" à l'intérieur et ce socket devrait persister pendant toute la durée de vie de l'application.

Ensuite, je veux mettre en œuvre la méthode async Connection.postMessage

Parce que postMessage peut prendre ammount beaucoup de temps:

  • postMessage devrait être async
  • postMessage doit la file d'attente des messages si neccesary

Notez que mon application publie des dizaines de messages par seconde, donc ce n'est pas une application ropier pour créer un nouveau thread pour chaque appel postMessage.

Je n'ai pas besoin de créer exactement un thread supplémentaire pour les messages, mais je ne sais pas où et comment.

màj: bon exemple http://msdn.microsoft.com/en-us/library/yy12yx1f(v=vs.80).aspx

+2

Votre question, tout comme la précédente, n'a rien à voir avec les singletons. Vous voulez savoir comment créer une file d'attente de messages. Il arrive juste que vous en fassiez un singleton. –

Répondre

3

Non, postMessage (lui-même) ne doit pas être async.

Il devrait

  • être thread-safe
  • assurer le fil de traitement est en cours d'exécution
  • file d'attente le message (ConcurrentQueue)
  • retour

Et le fil de traitement devrait

  • Attendez sur la file d'attente
  • Traiter les messages
  • peut-être lui-même Terminate au repos pour xx millisecondes

Qu'est-ce que vous avez est un classique producteur/la situation des consommateurs avec 1 Consommation et plusieurs producteurs.

PostMessage est le point d'entrée pour tous les producteurs.

+0

d'accord, sonnent comme cela devrait fonctionner pour mon application, va essayer de google pour la mise en œuvre de ce modèle. mais je pense que j'ai une question, comment "assurer le thread de traitement est en cours d'exécution". Comment créer et gérer le thread de traitement? – javapowered

+0

@javapowered: 'var t = new Thread (...);' et 'if (t.IsAlive)'. –

1

jp,

Vous êtes à la recherche à un problème classique producteur/consommateur ici ... Lors de l'initialisation du Connection devrait créer un MessageQueue démarrer une Sender dans son propre fil d'arrière-plan.

Ensuite, la connexion posts juste des messages à la file d'attente, pour l'expéditeur à ramasser et transmettre lorsque vous êtes prêt.Le bit délicat est la gestion de la taille maximale de la file d'attente ... Si le producteur dépasse constamment le consommateur, la file d'attente peut atteindre une taille impossible à gérer. L'approche la plus simple consiste à bloquer le thread producteur jusqu'à ce que la file d'attente ne soit plus pleine. Cela peut être fait avec un ARQ back-off. Par exemple: while(queue.isFull) sleep(100, "milliseconds"); queue.add(message); Si vous n'avez pas besoin d'une transmission à 100% (comme une application de chat, par exemple), vous pouvez simplement lancer une MessageQueueFullException, et le client pauvre devra juste s'en remettre ... tout simplement leur permettre de resoumettre plus tard ... permettant à l'utilisateur de gérer les retris pour vous.

Voilà comment je m'y attaquerais de toute façon. Je serai intéressé de voir quelles autres suggestions sont en sourdine.

Espérons que les choses fonctionnent pour vous. À votre santé. Keith

+1

Cela ne bloque pas ** le thread producteur. C'est occupé en attente. –

+0

Ouais ... il est occupé à attendre, ce qui au 1/10ème de seconde est assez rapide, et pas * trop * occupé ... comme pour ne pas bloquer le fil du producteur ... Hein? Le producteur ne va pas n'importe où jusqu'à ce que la queue ne soit pas pleine ... Je dirais que c'est assez constipé. – corlettk

+0

J'ai dit "L'approche la plus simple est de bloquer le fil du producteur" ... qu'une attente pas trop occupée fera correctement. Vous venez du camp "ne jamais utiliser goto", n'est-ce pas ... soupir. Je viens d'écrire un logiciel qui fonctionne. – corlettk

Questions connexes