2010-05-24 10 views
17

Me gustaría llamar a un método que pasa un parámetro cada 20 segundos, p. public void ProcessPerson (persona de IPerson)Cuál es la forma más eficiente de llamar a un método cada 20 segundos

He estado leyendo las diferentes opciones del temporizador y me pregunto si alguien podría recomendar la forma más eficiente de hacerlo.

Además, ¿hay alguna manera de mantener el parámetro fuertemente tipado en lugar de usar el objeto y luego tener que convertir a IPerson?

Gracias por su ayuda.

+0

Sólo me preguntaba, pero ¿por qué procesar una persona cada 20 segundos cuando se puede procesar cada persona su reciba el instante en que los reciba? – Juliet

+1

Fue pensado como un ejemplo, probablemente uno torpe :), es realmente cómo llamar a un método con un parámetro fuertemente tipado cada n segundos que estoy interesado. – CiaraM

Respuesta

4

Me gustaría System.Threading.Timer. Tenga en cuenta que Windows no es un sistema operativo en tiempo real, por lo que habrá alguna variación en el tiempo independientemente del mecanismo que elija.

Usted no ha dicho si esta función se presentará ningún tipo de cambios de interfaz de usuario, pero en caso de que también debe saber que la función de devolución de llamada se ejecuta en un hilo diferente por lo que en algunos casos como el que realizan cambios de interfaz de usuario que va a necesitar para tomar las medidas adecuadas para ordenar la solicitud de nuevo a la cadena de interfaz de usuario.

a Mariscal de la solicitud de nuevo a la interfaz de usuario de hilo que puede hacer lo siguiente

Para Windows Forms puede utilizar Control.Invoke

para WPF puede utilizar Dispatcher.Invoke

o la variante asíncrono BeginInvoke

23

A System.Threading.Timer es lo que necesita:

Proporciona un mecanismo para ejecutar un método a intervalos especificados.

Utilice un delegado TimerCallback para especificar el método que desea que ejecute el temporizador. El temporizador delegado se especifica cuando se construye el temporizador y no se puede cambiar. El método no se ejecuta en el hilo que creó el temporizador; se ejecuta en un subproceso de ThreadPool proporcionado por el sistema.

También existe la System.Windows.Forms.Timer:

implementa un contador de tiempo que provoca un evento a intervalos definidos por el usuario. Este temporizador está optimizado para su uso en aplicaciones de Windows Forms y debe utilizarse en una ventana.

Este temporizador de Windows está diseñado para un entorno de subproceso único donde los subprocesos de interfaz de usuario se utilizan para realizar el procesamiento.

Y no se olvide System.Timers.Timer:

El componente Timer es un temporizador basado en el servidor, lo que le permite especificar un intervalo recurrente a la que se ha producido el evento transcurrido en su aplicación.

El temporizador basado en servidor está diseñado para su uso con subprocesos de trabajo en un entorno multiproceso. Los temporizadores de servidor pueden moverse entre subprocesos para manejar el evento Elapsed elevado, lo que da como resultado más precisión que los temporizadores de Windows al elevar el evento a tiempo.

Así investigar cada uno y decidir cuál funciona mejor en su caso.

+4

Si usa Windows Forms the System.Windows.Forms.Timer es una mejor opción porque la devolución de llamada estará en el hilo de UI. –

+0

@Petar - gracias por eso, he actualizado la respuesta para cubrir ambos. – ChrisF

+0

También hay un temporizador System.Timers.Timer. ¿Tal vez podrías agregar eso a tu respuesta para completarlo? –

0

Puede usar esto, solo asegúrese de que lo que esté haciendo sea seguro para hilos.


using System.Threading; 

public void DoStuff(IPerson person) 
{ 
    new Timer(ProcessPerson, person, 0, 20000); 
} 

public void ProcessPerson(object threadState) 
{ 
    IPerson person = threadState as IPerson; 
    // do your stuff 
} 
+0

Hay al menos [3 clases] (http: // msdn.microsoft.com/en-us/magazine/cc164015.aspx) en el marco .net llamado 'Timer'. Deberías aclarar de cuál estás hablando. (Supongo que del constructor al que se refiere [System.Threading.Timer] (http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx)) –

+0

Sí, debería haberlo hecho sido más claro. Editado para incluir el espacio de nombres System.Threading. Además, solo para observar, mi solución no garantiza que ProcessPerson solo se llame cada 20 segundos, llamará a ProcessPerson cada 20 segundos, independientemente de si la última ProcessPerson ha finalizado o no. – Adam

Cuestiones relacionadas