2009-11-21 2 views
0

Il ya quelque temps, j'ai écrit un service avec une minuterie qui font une action toutes les n minutes. Tout allait bien. Mais maintenant, je veux écrire un service qui attend un signal, un message ou quelque chose d'une application gui pour faire son travail.réveiller un service, la communication avec les services

Je me veux processus de dormir pacefull (pas en quelque chose renifler boucle infinie) jusqu'à ce que mon application WinForms lui dire: « Hé, faire des choses et de me donner un anneau lorsque le travail est fait »

Quelqu'un pourrait-il me donner point de vue?

Merci.

Répondre

3

Vous pouvez utiliser Windows Communication Foundation pour permettre à votre client de communiquer avec votre service, de lui envoyer des demandes et de vous inscrire pour recevoir des événements de progression à partir de travaux en cours.

0

Si le service Windows est sur la même machine, vous pouvez arrêter et démarrer le service? ou appelez un service Web qui arrête/démarre un service sur une autre machine?

Si vous aviez un service qui interroge (ou "renifle") quelque chose à faire, cela pourrait être un très petit et basique appel à une base de données pour vérifier quelque chose qui va déclencher le travail réel?

+0

Si j'arrête et démarre le service, comment mon programme peut-il savoir quand le travail est terminé et si une erreur s'est produite? Je veux éviter les sondages. Bien sûr, je peux le faire de cette façon et ensuite écrire les résultats dans un tableau, mais je pense que ce serait mieux et élégant une sorte de communication directe. Quelque chose comme des événements soulevés par un côté et attrapé par l'autre côté. – Jonathan

+0

Vous pourriez simplement initié le début du service. Le service pourrait alors arrêter lui-même une fois terminé? –

3

Vous devez utiliser la communication interprocessus (IPC). Pour C#, cela signifie généralement .NET remoting - sur les anciennes versions de .NET - ou Windows Communication Foundation (WCF) - sur les versions plus récentes de .NET. Essentiellement, l'application cliente se connecte à une interface implémentée par le service et peut ensuite appeler des méthodes, comme si elle était dans le même processus.

Si cela est trop compliqué, vous pouvez utiliser un objet événement nommé, sur lequel le service attend, et les ensembles de clients.

1

Point de départ:

service WCF auto-hébergement

1

Tout des mécanismes IPC se qualifier pour y parvenir. Si vous avez besoin d'un simple passage de message, pensez à un canal nommé (NamedPipeServerStream) ou à un socket. Si elles sont élaborées, envisagez d'utiliser Remoting sur un canal IPC ou un WCF.

Personnellement, j'aime les pipes nommées pour cela. Assurez-vous simplement que le nom du canal est préfixé par "Global" afin qu'il soit visible depuis la session de bureau interactive. Chiffrer les messages si la sécurité est une préoccupation. Renforcez un thread d'arrière-plan dans votre service qui effectue un appel de blocage sur le flux de pipeline pour implémenter la gestion des messages.

Questions connexes