2012-06-25 73 views
8

El hilo principal de la aplicación está haciendo un poco de trabajo.método de llamada asíncrono C# periódicamente

También existe un temporizador, que cada 10 minutos debe llamar a algún método que se ejecute de forma asíncrona.

¿Podría darme un buen ejemplo de cómo organizar esto?

+2

¿Esto es ASP.NET, formularios, otros? –

+1

¿Es esta una aplicación GUI? – Tudor

+0

Es un servicio de Windows que en realidad es un servidor y siempre está a la escucha de nuevas conexiones. Entonces, no hay GUI, pero el trabajo del servidor no debería detenerse – Ksice

Respuesta

12

Yo no recomendaría el uso de un hilo explícita con un lazo y dormir. Es una mala práctica y fea. Hay clases de temporizador para este propósito:

Si esta no es una aplicación GUI, entonces puede usar System.Threading.Timer para ejecutar código en un hilo diferente periódicamente.

Si se trata de una aplicación WinForms/WPF eche un vistazo a System.Windows.Forms.Timer y System.Windows.Threading.DispatcherTimer respectivamente. Estos son útiles porque ejecutan su código en el hilo de la GUI, por lo que no necesitan llamadas explícitas Invoke.

Los enlaces también contienen ejemplos para cada uno.

+0

Simplemente una curiosidad, si estos temporizadores se ejecutan en el hilo de la GUI bloquearán la aplicación principal, seguramente un hilo separado es mejor para el requisito asincrónico. Aunque estoy de acuerdo en que mantener un hilo entero vivo para una ejecución cada 10 minutos no es ideal. – Vok

+0

@Vok: depende de lo que necesite hacer. Estos temporizadores son buenos para una actualización periódica rápida de la GUI. Si el código es de más larga ejecución, debe usar 'System.Threading.Timer' con una' Invoke' explícita solo para la parte de actualización. De todos modos, es bueno saber las herramientas disponibles para diferentes situaciones. – Tudor

1

La manera más fácil es llamar al una función grande que duerme durante 10 minutos entre las acciones. Esto no bloquea nada porque está en otro hilo.

En .NET 4, podría hacer esto con la clase Task:

Task t = Task.Factory.StartNew(() => { /* your code here */ }); 
// or 
Task t = Task.Factory.StartNew(YourFunctionHere); 

void YourFunction() { 
    while (someCondition) { 
     // do something 
     Thread.Sleep(TimeSpan.FromMinutes(10)); 
    } 
} 

(este código no ha sido probado)

0

Usar un hilo BackgroundWorker.

void FireTask() 
{ 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //Your job 
} 
-2

iniciar otro hilo que se ejecuta un bucle

Dentro del bucle; duerma durante 10 minutos y luego llame a su método, repita

Cuestiones relacionadas