¿Cuál es la mejor manera de realizar una inicialización prolongada cuando se inicia un servicio de Windows (o se reanuda desde la pausa) sin bloquear el Administrador de control de servicios?Realice una inicialización prolongada en el servicio de Windows
Respuesta
Puede usar un BackgroundWorker
para realizar su larga operación en respuesta al evento Service.Start.
Es bastante fácil de hacerlo en el método OnStart()
de su ServiceBase
-derivada. También hay un razonable good example on MSDN.
protected override void OnStart(string[] args)
{
var worker = new BackgroundWorker();
worker.DoWork += DoSomeLongOperation;
worker.RunWorkerAsync();
}
private void DoSomeLongOperation(object sender, DoWorkEventArgs e)
{
// do your long operation...
}
en cuenta que también puede suscribirse a los ProgressChanged
y RunWorkerCompleted
eventos, para que pueda informar al gestor de control de servicios de su progreso y puesta en el éxito (o el fracaso).
Tengo que hacer esto también: genero un hilo en el inicio que hace toda su inicialización y establece un 'isInitialized' privado en verdadero cuando está terminado. El servicio realiza acciones periódicamente (es decir, en un temporizador) y no comenzará esas acciones si isInitialized no se establece en verdadero.
Normalmente utilizamos un temporizador simple para lograr esta funcionalidad. Configuraremos el temporizador en el servicio OnStartup, dejaremos que el servicio responda de nuevo al Administrador de control de servicios y luego haremos que el temporizador inicie el proceso luego de unos segundos. Ese proceso puede ir en un hilo separado o no dependiendo de lo que se necesita hacer. El temporizador se puede reutilizar si este proceso debe realizarse a intervalos regulares.
La mejor manera pragmática es crear un hilo de trabajo.
En general existe otra forma documentada, que puedo explicar en el ejemplo del código no administrado. Durante la inicialización, un servicio de Windows tiene poco tiempo para hacerlo. Esta vez se puede cambiar en algún lugar del registro. Si necesita un servicio más si se puede llamar
SetServiceStatus
con dwCurrentState=SERVICE_START_PENDING
algunos dwCheckPoint
y dwWaitHint
, de SERVICE_STATUS
estructura llena de manera que dwWaitHint
es el tiempo estimado requerido para una operación de marcha pendiente en milisegundos. Antes de que haya transcurrido el tiempo especificado, el servicio debe realizar su siguiente llamada a la función SetServiceStatus
con un valor incrementado dwCheckPoint
o un cambio en dwCurrentState
. Vea la descripción de dwWaitHint
en http://msdn.microsoft.com/en-us/library/ms685996(VS.85).aspx.
También tuve este problema con un servicio de Windows. Creo que debe mantener la lógica de inicialización por debajo de 30 segundos; de lo contrario, el Administrador de servicios de Windows detendrá el servicio.
Lo que hice fue bastante simple. Creé un método donde puse toda la lógica pesada que necesitaba ser ejecutada y luego creé un temporizador que marcaba después de 20 segundos y ejecutaba ese método. Entonces el servicio se iniciará, luego creará el temporizador, lo inicializará con un intervalo de 20 segundos y luego finalizará la inicialización. Después de 20 segundos, el temporizador marcaría y comenzaría la lógica comercial de la aplicación. Por supuesto, puede especificar el intervalo de tiempo que desee.
Usted debe declarar el temporizador como un parámetro de la clase:
public partial class YourService: ServiceBase
{
System.Timers.Timer tmrOnStart;
Entonces inicializar el temporizador en el método OnStart
protected override void OnStart(string[] args)
{
//set the interval to 20 seconds
tmrOnStart = new Timer();
tmrOnStart.Interval = 20000;
tmrOnStart.Enabled = true;
tmrOnStart.AutoReset = false;
tmrOnStart.Elapsed += new ElapsedEventHandler(tmrOnStart_Elapsed);
tmrOnStart.Start();
}
Cuando el temporizador se activará el evento transcurrido, se ejecutará este método:
void tmrOnStart_Elapsed(object sender, ElapsedEventArgs e)
{
heavyBusinessLogicMethod();
}
Y tendrías que poner tu lógica en el heavyBusine Método ssLogicMethod.
- 1. Tarea de ejecución prolongada (o para siempre) en Windows Azure
- 2. Mantenimiento de una tarea de ejecución prolongada en Linux
- 3. Realice una consulta de búsqueda en Outlook
- 4. ¿Es posible hacer una inicialización estática de mutexes en Windows?
- 5. Alojamiento del servicio WCF en el servicio de Windows
- 6. Realice una búsqueda en celdas ocultas
- 7. Realice una tarea al desinstalar en android
- 8. El servicio de Windows necesita esperar, Thread.Sleep?
- 9. Instalar el servicio de Windows sin InstallUtil.exe
- 10. C# Servicio de Windows Tiempo de espera en el inicio
- 11. El servicio de Windows no funciona
- 12. Servicio de Windows: obtenga el directorio actual
- 13. Problema al instalar el servicio de Windows
- 14. ¿Cuándo usamos el servicio de Windows?
- 15. MSDeploy para instalar el servicio de Windows?
- 16. ¿Inno Setup para el servicio de Windows?
- 17. Credenciales al instalar el servicio de Windows
- 18. Programe el servicio de Windows con Quartz.NET
- 19. Crear servicio de Windows desde el ejecutable
- 20. iniciar el servicio de Windows desde java
- 21. Utilice SqlTransaction & IsolationLevel para una operación de lectura prolongada?
- 22. Servicio de detención/inicio en el código en Windows 7
- 23. Realice una ejecución de destino una vez en el nivel de Solución en MSBuild
- 24. lanzando una excepción en un servicio de Windows
- 25. Windows no puede iniciar el servicio
- 26. WCF Servicio de Windows TimeOut
- 27. filesystemwatcher como servicio de Windows?
- 28. Procesando mensaje de MSMQ en el servicio de Windows
- 29. Impedir javascript de ejecución prolongada bloquear el navegador
- 30. Servicio de Windows terminado inesperadamente