7
votes

Quelle est la bonne façon d'avoir un service de service Windows et de commencer gracieusement lorsque vous suspendez / reprenant un PC?

J'ai besoin d'arrêter notre service Windows lorsqu'un PC est alinéa en mode suspension et redémarrez-le lorsque le PC est repris. Quelle est la bonne façon de faire cela?


4 commentaires

Alors, pourquoi ne pas reformuler votre question à "Pourquoi ne puis-je pas remplacer surpowerevent?" C'est clairement le mécanisme préféré pour traiter la situation.


Je pensais pourquoi je ne pouvais pas le remplacer, je suis un idiot et j'ai fait le type de retour nul ... hahaha. Suppose que je peux éditer cette question et la rendre utile


Donc, c'est la voie à suivre.


Toujours taper remplacer puis utiliser le code d'achèvement du code


4 Réponses :


0
votes

C'est l'une des caractéristiques du service Windows.

Shutdown

L'arrêt est effectué automatiquement lorsque le PC est éteint. Pas besoin de faire quoi que ce soit. Pour effectuer tout nettoyage, vous aurez besoin de remplacer les méthodes de type Servicebase tels que Onpowerevent , échantillon xxx

Démarrage

Pour démarrer automatiquement un service automatiquement Vous devez la définir sur serviceStarmode.Automatic comme ici xxx


1 commentaires

Eh bien, nous avons des choses à faire en cas d'arrêt, nous devons donc effectuer ces premiers, puis appelez la base.onsHutdown (), base.onstop (), etc.



0
votes

au lieu d'arrêter votre service, pouvez-vous simplement arrêter le traitement avec quelque chose comme ...

Microsoft.Win32.SystemEvents.PowerModeChanged += this.SystemEvents_PowerModeChanged;

    private void SystemEvents_PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs e)
    {
        if (e.Mode == PowerModes.Suspend)
            {

            }

        if (e.Mode == PowerModes.Resume)
            {

            }
    }


4 commentaires

Notez que si vous faites cela, vous devez vous assurer que la suspension ne prend pas trop longtemps car le temps accordé par le responsable du contrôle de service lors d'une surcharge régulière de Suspend ONPowerevent pourrait ne pas être accordée ici.


@Ernodeweerd: Les gestionnaires d'événements sont probablement appelés synchroneusement de l'intérieur Onpowerevent , donc je ne pense pas que le comportement soit différent.


Oh, tu as raison. Je n'ai pas remarqué que cet événement n'était pas fourni par ServiceBase .


Ce code a besoin d'une fenêtre en cours d'exécution. Ce n'est peut-être pas ce que vous voulez dans un service Windows.



8
votes

3 commentaires

Définir CanhandlePowereventer in Service Constructor - Impossible de modifier CANSTOP, CANPAUSEANDCONTINUE, CANSHUTDOWDOWN, CanhandlePowEvent ou CanhandlesessionChangeVente Valeurs de propriété après le démarrage du service.


Selon ce RéférencesSource.microsoft .Com / # System.ServiceProcess / System / ... Ce n'est pas marqué avec le drapeau?


Utiliser HASFLAG () Voici vraiment tort! Regardez dans les valeurs ENUM de PowerBroadcastatus de voir que ce n'est pas du tout approprié comme un masque de bit.



3
votes

Commentaire sur Alex Filipovici Réponse Modifié le 16 mai '13 à 17:05:

Service cannot be started. System.InvalidOperationException: Cannot change CanStop, CanPauseAndContinue,     CanShutdown, CanHandlePowerEvent, or CanHandleSessionChangeEvent property values after the service has been started.
   at System.ServiceProcess.ServiceBase.set_CanHandlePowerEvent(Boolean value)
   at foo.bar.OnStart(String[] args)
   at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)


0 commentaires