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? P>
4 Réponses :
C'est l'une des caractéristiques du service Windows.
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 Pour démarrer automatiquement un service automatiquement Vous devez la définir sur Servicebase code> tels que Onpowerevent code> , échantillon p> Démarrage h3>
serviceStarmode.Automatic code > comme ici p>
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.
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)
{
}
}
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 code>, 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 code>.
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.
Vous devriez remplacer le ServiceBase.onpowereventer.2/a>. protected override void OnStart(string[] args)
{
this.CanHandlePowerEvent = true;
}
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.
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)
Alors, pourquoi ne pas reformuler votre question à "Pourquoi ne puis-je pas remplacer surpowerevent?" I> 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 code> puis utiliser le code d'achèvement du code