2008-10-10 17 views
5

Tengo una aplicación heredada WinForms Mdi en VB.Net 2.0 a la que le agrego funcionalidad. Una de las adiciones es una advertencia que debe plantearse cuando la hora actual se acerca a un valor especificado (una fecha límite). Mi intención es verificar la hora una vez por hora hasta que haya menos de una hora hasta la fecha límite, luego mostrar advertencias a intervalos específicos hasta que se acabe el tiempo.Which .Net Timer() para usar

El usuario debe poder continuar utilizando la aplicación hasta e incluso después de la fecha límite, pero debe conocer periódicamente la proximidad del plazo.

La aplicación no utiliza System.Threading todavía y mi conocimiento de la misma está limitado en este momento. Yo sé que hay 3) (métodos diferentes de temporizador disponibles:

  • System.Threading.Timer(),
  • Windows.Forms.Timer() y
  • System.Timers.Timer()

Mi pregunta es, ¿cuál es la mejor manera de hacerlo? Intenté usar el temporizador de subprocesos, pero como WinForms no es seguro para subprocesos, recibí un error de tiempo de ejecución al intentar acceder a otra clase. ¿Vale la pena proteger el hilo de clase/forma? ¿Estoy completamente fuera de pista?

Gracias.

+0

Es posible hacer WinForms roscados de programación, por cierto. Solo necesita detectar si se está realizando una llamada a método en el mismo subproceso que un formulario, y si no, envíelo al hilo apropiado. Suena más difícil de lo que realmente es. –

Respuesta

6

Solo usaría el temporizador Forms. Creo que leí que no es tan preciso, pero parece que no es necesario.

+2

el temporizador de formularios se sincroniza automáticamente en el formulario, lo que debería eliminar los problemas de acceso de control entre subprocesos como un bonus –

11

En este artículo se explica bastante bien:

Comparing the Timer Classes in the .NET Framework Class Library

Suena como System.Windows.Forms.Timer es la ideal para usted.

Mi guía: Si desea que el temporizador se ejecute en su hilo principal de la GUI, quédese con Windows.Forms.Timer. Si está bien que su temporizador se llame de manera asincrónica en un hilo del grupo de subprocesos, o si no desea experimentar los pequeños retrasos que System.Windows.Forms.Timer tiende a sufrir, use System.Timers.Timer. System.Threading.Timer tiene una interfaz diferente de las otras dos y no es seguro para subprocesos; personalmente, no soy fan

-1

Ok, lo primero es lo primero ...

Si desea mostrar al usuario un formulario y hacer algo en el fondo me gustaría utilizar la clase BackgroundWorker, que trabajó para mí antes. Además, necesita invocar métodos como se mencionó anteriormente y, como dijo Chris, suena más difícil de lo que realmente es.

Aquí hay un enlace que creo que te ayudará.
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

+1

-1? ¿Qué pasa con mi respuesta? – sebagomez

0

El System.Forms.Timer realmente funciona en el hilo principal usando la cola de mensajes de Windows. Esto lo hace algo impreciso, pero como realmente no necesitas ms precisión, es suficiente. Puede usar uno de los otros temporizadores que funcionan en un subproceso separado, pero como necesita activar un componente de winforms que funcione en general, deberá usar Form.Invoke o de alguna otra forma para pasar el evento al hilo principal - que también causaría algo de latencia. En conclusión use System.Forms.Timer cuando necesite activar un componente basado en winforms.