2011-06-09 6 views
15

Estoy intentando detener un servicio de Windows en una máquina local (el servicio es Topshelf.Host, si lo que importa) con este código:ServiceController parece ser incapaz de detener un servicio

serviceController.Stop(); 
serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 

timeout se establece en 1 hora, pero el servicio nunca se detiene. Algo extraño con esto es que desde el complemento Servicios MMC lo veo en estado "Detener" primero, pero después de un tiempo vuelve a "Comenzado". Sin embargo, cuando intento detenerlo manualmente, aparece un error:

Windows could not stop the Topshelf.Host service on Local Computer. 
Error 1061: The service cannot accept control messages at this time. 

¿Echo algo aquí?

Respuesta

1

que he visto este tema también, específicamente cuando un servicio es comenzar pendiente y lo envío una parada de programación qué sucede, pero no hace nada. También a veces veo que los comandos de detención de un servicio en ejecución fallan con la misma excepción pero aún así detienen el servicio. No creo que se pueda confiar en que la API haga lo que dice. Esta explicación mensaje de error es muy útil ...

http://technet.microsoft.com/en-us/library/cc962384.aspx

0

acabo luchaban este problema mientras se mueve el código de una vieja caja de partición múltiple a una caja única partición nueva. En la parada del servicio escribía a D: y como ya no existía, recibí un error 1061. Sin embargo, cualquier operación prolongada durante OnStop causará esto a menos que desvíe la llamada a otro hilo con un delegado de devolución de llamada.

10

Puede ser que su servicio está ocupada procesando una operación grande o está en transición para cambiar el estado. por lo tanto, no puede aceptar más datos ... solo piense que puede tomar más de lo que puede masticar ...

si está seguro de que no ha alimentado nada importante, solo vaya al administrador de tareas y matar el proceso de este servicio o reiniciar su máquina.

1

que se enfrentaron al error similar issue.This a veces se producen debido a que el servicio ya no puede aceptar mensajes de control, esto puede ser debido a problemas de espacio de disco en el servidor en el archivo de registro de aquellos servicios específicos está presente. Si esto ocurre, también puede considerar la opción siguiente. 1.Go a la ubicación en el exe servicio que & del archivo de registro se encuentra. 2.Free algo de espacio 3.Kill proceso de los servicios a través del gestor de tareas 4.Inicie el servicio.

17

Sé que es bastante tarde para responder a esto, pero me enfrenté a un problema similar, es decir, el error: "El servicio no puede aceptar mensajes de control en este momento". y me gustaría agregar esto como referencia para otros.

Usted puede tratar de matar a este servicio a través de PowerShell (PowerShell ejecutar como administrador):

#Get the PID of the required service with the help of the service name, say, service name. 
$ServicePID = (get-wmiobject win32_service | where { $_.name -eq 'service name'}).processID 

#Now with this PID, you can kill the service 
taskkill /f /pid $ServicePID 
+0

Gracias, esto es bueno – user584018

+0

no podía matar al servicio usando el Administrador de tareas como administrador, y reiniciar tampoco ayudó. Este fue el método que funcionó para mí. – ChrisG

+0

funcionó para mí. No te olvides de ejecutar powershell como administrador también. – Aaron

1

que tenían exactamente el mismo problema con Topshelf servicio alojado. Causa fue un tiempo de inicio de servicio largo, más de 20 segundos. Esto dejó el servicio en un estado en el que no pudo procesar otras solicitudes. Pude reproducir el problema solo cuando se inició el servicio desde la línea de comando (net start my_service).

inicialización adecuada para el servicio Topshelf con el tiempo la estrella larga es el siguiente:

namespace Example.My.Service 
{ 
    using System; 
    using System.Threading.Tasks; 

    using Topshelf; 

    internal class Program 
    { 
     public static void Main() 
     { 
      HostFactory.Run(
       x => 
       { 
        x.Service<MyService>(
         s => 
         { 
          MyService testServerService = null; 
          s.ConstructUsing(name => testServerService = new MyService()); 
          s.WhenStarted(service => service.Start()); 
          s.WhenStopped(service => service.Stop()); 
          s.AfterStartingService(
           context => 
           { 
            if (testServerService == null) 
            { 
             throw new InvalidOperationException("Service not created yet."); 
            } 
            testServerService.AfterStart(context); 
           }); 
         }); 
        x.SetServiceName("my_service"); 
       }); 
     } 
    } 

    public sealed class MyService 
    { 
     private Task starting; 

     public void Start() 
     { 
      this.starting = Task.Run(() => InitializeService()); 
     } 

     private void InitializeService() 
     { 
      // TODO: Provide service initialization code. 
     } 

     [CLSCompliant(false)] 
     public void AfterStart(HostControl hostStartedContext) 
     { 
      if (hostStartedContext == null) 
      { 
       throw new ArgumentNullException(nameof(hostStartedContext)); 
      } 
      if (this.starting == null) 
      { 
       throw new InvalidOperationException("Service start was not initiated."); 
      } 
      while (!this.starting.Wait(TimeSpan.FromSeconds(7))) 
      { 
       hostStartedContext.RequestAdditionalTime(TimeSpan.FromSeconds(10)); 
      } 
     } 

     public void Stop() 
     { 
      // TODO: Provide service shutdown code. 
     } 
    } 
} 
Cuestiones relacionadas