2010-06-17 5 views
1

Dans une application que je crée, j'ai deux composants que je veux que l'utilisateur soit en mesure de faire une pause/reprendre. Je me demande quels modèles standards pourraient exister pour appuyer la mise en pause et la reprise, le cas échéant? Les deux composants font beaucoup d'E/S réseau. Il semble que, à un niveau élevé, je dois persister dans la file d'attente actuelle de chaque composant - mais persister c'est où je cherche ces modèles standard? Dois-je sérialiser le composant lui-même? Est-ce que je sérialise juste le travail? Quel format dois-je sérialiser (xml, base de données, etc ...)? Qu'est-ce que .NET a construit dans cela pourrait aider? Y a-t-il des bibliothèques pour vous aider? Y a-t-il des différences à prendre en compte si l'utilisateur s'arrête/reprend dans la même session d'application ou s'il fait une pause/reprend après l'ouverture, la fermeture et l'ouverture de l'application? Qu'en est-il de la persistance de cette information sur différents ordinateurs?C# - Comment implémenter une sémantique de pause/reprise?

Des suggestions d'expériences passées ou de modèles qui vous viennent à l'esprit? J'espère que cela se transforme en plus de discussion sur les différentes façons de faire cela et les avantages/inconvénients de chacun. Merci.

+0

Est-ce que vous interrompez la communication entre les composants et que le "travail" continue à s'accumuler ou le travail est-il également suspendu? Il fait définitivement une différence si le travail suspendu doit survivre à la fin de l'application. Une file d'attente de messages vous permettra d'accumuler du travail (messages) sans risque de perdre l'appilcation est terminée, mais peut être une solution plus lourde que nécessaire. – ScottS

+0

Scott - Non, le travail ne s'accumulera pas lorsque l'application est en pause. Pouvez-vous expliquer comment une file d'attente de messages survivra si l'application est terminée? Peut-être fournir plus de détails sur cette structure de file d'attente de messages dont vous parlez? Mes deux composants ont déjà des files d'attente de travail, mais ils ne survivraient pas si l'application était fermée. Merci. – Chad

Répondre

1

Par file d'attente de messages, je voulais dire MSMQ ou l'un de ses frères. Tous les messages seraient conservés dans une sorte de base de données et donc toujours disponible lorsque l'application redémarre. L'objectif principal de ces files d'attente est de s'assurer que les messages sont délivrés même lorsque la communication est intermittente et/ou non fiable.

Il semble que vous puissiez faire en sorte que vos composants de communication utilisent plutôt MSMQ au lieu de vos files d'attente actuelles.

Si cela ne convient pas à votre application, il est probablement aussi simple que de sérialiser les objets dans vos files d'attente existantes lors de la terminaison et de les dé-sérialiser au démarrage de l'application. Si survivre à une résiliation imprévue est important, vous devez toujours sérialiser un objet au fur et à mesure qu'il est ajouté à la file d'attente, mais à ce stade, vous pouvez réexaminer un système de file d'attente de messages existant.

+0

Merci Scott! Il semble que MSMQ prendra soin de mes besoins. – Chad

-1

Vous pouvez implémenter le threading et simplement appeler les fonctions Suspend() et Resume() sur le thread en conséquence.

+0

Ces méthodes sont à la fois dépréciées et ne fonctionneront pas entre les sessions d'application (par exemple, application ouverte, démarrage du travail, pause de travail, fermeture de l'application, application ouverte, reprise). – Chad

+0

En plus des commentaires de Chad, les méthodes Suspend et Resume sont une très mauvaise idée car elles ne fonctionneront pas bien avec les E/S réseau. Vous ne voulez pas seulement faire une pause, vous voulez faire une pause au bon point dans la séquence de protocole, et maintenir n'importe quel keep-alives, si nécessaire. –

+0

Je vois, http://stackoverflow.com/questions/142826/is-there-a-way-to-indefinitely-pause-a-thread peut jeter un peu de lumière. –

Questions connexes