2010-06-17 9 views

Respuesta

9

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).

1

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.

1

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.

0

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.

1

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.

Cuestiones relacionadas