El evento Timer de formularios Windows Forms no se provoca en un servicio de Windows

Seleccione idioma Seleccione idioma
Id. de artículo: 820639 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Agregue un componente de temporizador de Microsoft Windows Forms al servicio de Windows. Habilite al temporizador y, a continuación, establece el intervalo del temporizador provocar un evento. Instalar el service para Windows en el equipo y, a continuación, iniciar el servicio. No se provoca el evento Timer en el servicio de Windows.

Nota El componente timer de formularios Windows Forms se encuentra en el espacio de nombres System.Windows.Forms .

Causa

El componente de temporizador de Windows Forms está diseñado para un Windows entorno de formularios. El componente timer de formularios Windows Forms no está diseñado para un entorno de servidor. Por lo tanto, el temporizador no puede provocar eventos si se utiliza en un servicio de Windows.

Solución

Para resolver este problema, utilice temporizadores de servidor desde el espacio de nombres System.Timers en lugar de los temporizadores de formularios Windows Forms desde el espacio de nombres System.Windows.Forms . Para ello, siga estos pasos:
  1. Ejecute el comando siguiente en la ventana comando para quitar la clase Service1 :
    InstallUtil /u WindowsService1.exe
    Nota WindowsService1.exe se encuentra en la carpeta bin bajo la carpeta de proyecto. Agregue la ruta de acceso de su WindowsService1.exe.
  2. Cambie al proyecto de servicio de Windows.
  3. En la ventana del diseñador Service1 , haga clic en el control de Timer1 .
  4. Presione la tecla SUPR para quitar el Timer1 control desde la ventana del diseñador.
  5. En la barra de herramientas, haga clic en los componentes de ficha.
  6. Arrastre un control Timer desde la barra de herramientas a la ventana Diseñador.
  7. Haga doble clic en el control de Timer1 en la ventana del diseñador para ver la ventana código.
  8. Mueva el código en el controlador del evento del control Timer1 Tick al controlador de transcurrido eventos del control Timer1 .
  9. Quite el controlador de eventos Tick .
  10. En el menú Generar , haga clic en Generar soluciones .
  11. Ejecute el comando siguiente en la ventana de comandos:
    InstallUtil WindowsService1.exe
  12. En el menú Herramientas administrativas , haga clic en servicios .
  13. Haga clic con el botón secundario del mouse en Service1 y, a continuación, haga clic en Inicio .
  14. Espere varios segundos, haga clic con el botón secundario del mouse en Service1 y a continuación, haga clic en Detener .
  15. Abra el archivo C:\sample.txt y, a continuación, observe el texto.

    El texto de marca se muestra con Start y Stop .

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el problema

  1. Inicie Microsoft Visual Studio NET..
  2. Abrir un nuevo proyecto de servicio de Windows mediante Microsoft Visual Basic .NET o Microsoft Visual C#. NET.

    De forma predeterminada, se crea Service1 .
  3. En el cuadro de herramientas, haga clic en los Formularios Windows Forms ficha.
  4. Arrastre un control Timer desde el cuadro de herramientas hasta la ventana del diseñador Service1 .
  5. En la ventana del diseñador, haga doble clic en el control de Timer1 .

    Aparecerá la ventana de código de Service1 .
  6. Si está utilizando Visual C#. NET, agregue la siguiente instrucción al principio del código:
    using System.IO;
  7. Agregue el código siguiente a la OnStart procedimiento de la clase Service1 .

    código de Visual Basic .NET
    'Set the interval of the timer to 3 seconds.
    Timer1.Interval = 3000
    Timer1.Enabled = True
    'Open the sample.txt file in append mode.
    FileOpen(1, "C:\sample.txt", OpenMode.Append)
    'Print text to the "C:/sample.txt file.
    Print(1, "Start")
    FileClose()
    Código Visual C# .NET
    //Set the interval of timer to 3 seconds.
    timer1.Interval =3000;
    //Enable the timer.
    timer1.Enabled =true;
    //Append the text to the sample file.
    StreamWriter writer =File.AppendText(@"C:\sample.txt");
    writer.WriteLine("Start");           
    writer.Close();
  8. Agregue el código siguiente a la OnStop procedimiento de la clase Service1 .

    código de Visual Basic .NET
    'Open the C:\sample.txt file in append mode.
    FileOpen(1, "C:\sample.txt", OpenMode.Append)
    'Print the text 'Stop' to the C:\sample.txt file.
    Print(1, "Stop")
    FileClose()
    Código Visual C# .NET
    //Append the text Stop to the C:\sample.txt file.
    StreamWriter writer =File.AppendText(@"C:\sample.txt");
    writer.WriteLine("Stop");
    writer.Close();
  9. Agregue el código siguiente al evento Tick del componente Timer1 .

    código de Visual Basic .NET
     'Set the enabled property to false.
    Timer1.Enabled = False
    'Open the C:\sample.txt file in append mode.
    FileOpen(1, "C:\sample.txt", OpenMode.Append)
    'Print the text 'Tick' to the C:\sample.txt file.
    Print(1, "Tick")
    FileClose()
    'Enable the timer.
    Timer1.Enabled = True
    Código Visual C# .NET
    //Set the enable property to false.
    timer1.Enabled =false;
    //Append the text Tick to the C:\sample.txt file.
    StreamWriter writer =File.AppendText(@"C:\sample.txt");
    writer.WriteLine("Tick");
    writer.Close();
    timer1.Enabled =true;
  10. En el menú Ver , haga clic en Diseñador .
  11. Haga clic con el botón secundario del mouse en Diseñador y, a continuación, haga clic en Agregar instalador .

    De forma predeterminada, se crean ServiceInstaller1 y ServiceProcessInstaller1 .
  12. Haga clic con el botón secundario del mouse en ServiceInstaller1 y, a continuación, haga clic en Propiedades .
  13. Establezca la propiedad DisplayName para Service1 .

    Nota Es una buena idea para establecer la propiedad ServiceName en Service1 .
  14. Haga clic con el botón secundario del mouse en ServiceProcessInstaller1 y, a continuación, haga clic en Propiedades .
  15. En los ServiceProcessInstaller1 ventana Propiedades, establezca la propiedad Account a LocalSystem .
  16. En el menú Generar , haga clic en Generar soluciones .
  17. Haga clic en Inicio y, a continuación, haga clic en Ejecutar .
  18. En la ventana Ejecutar, escriba cmd en el cuadro Abrir y, a continuación, presione la tecla ENTRAR.
  19. En el símbolo del sistema, ejecute el siguiente comando:
    installutil  WindowsService1.exe
    Nota el servicio Service1 no está instalado si utilizas cualquier otro servicio con el mismo nombre.
  20. Una vez finalizada la instalación, haga clic en Herramientas administrativas en el panel de control y, a continuación, haga clic en servicios .
  21. En la ventana Servicios, haga clic con el botón secundario del mouse en Service1 y, a continuación, haga clic en iniciar .
  22. Espere varios segundos, haga clic con el botón secundario del mouse en Service1 y a continuación, haga clic en Detener .
  23. Abra el archivo C:\sample.txt.

    El texto mostrado StartStop . No se provoca el evento Tick de Timer1 y el texto de marca no se imprime en el archivo C:\sample.txt.

Referencias

Para obtener más información acerca de las aplicaciones de servicios de Windows, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/aa984074(VS.71).aspx

Propiedades

Id. de artículo: 820639 - Última revisión: miércoles, 16 de mayo de 2007 - Versión: 1.3
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palabras clave: 
kbmt kbvs2005doesnotapply kbvs2005swept kbserviceprocess kbctrl kbcontrol kbevent kbtimer kbwindowsforms kbservice kbprb KB820639 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 820639

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com