2009-04-08 9 views
13

que tienen un aspecto de mensajería de mi solicitud utilizando Jabber-net (un XMPP library.)¿Los temporizadores .NET se ejecutan de forma asincrónica?

Lo que me gustaría hacer, si por alguna razón se puso fin a la conexión con el servidor, se sigue intentando conectar cada minuto más o menos.

Si inicio un temporizador para esperar un período de tiempo antes del siguiente intento, ¿ese temporizador se ejecuta de forma asíncrona y el evento Tick resultante se une al hilo principal o tendré que iniciar mi propio hilo y comenzar el temporizador desde dentro de allí?

Respuesta

35

¿Qué tipo de temporizador estás usando?

  • System.Windows.Forms.Timer ejecutará en el hilo de interfaz de usuario
  • System.Timers.Timer ejecuta en un hilo de rosca de la piscina a menos que especifique un SynchronizingObject
  • System.Threading.Timer ejecuta su devolución de llamada en un hilo de rosca de la piscina

En todo En los casos, el temporizador en sí será asíncrono, no "tomará" un hilo hasta que se dispare.

+0

Recuerde si no está utilizando el System.Windows.Forms.Timer que al acceder a un Control arrojará una excepción a menos que haga la invocación y el invocador requeridos apropiados. –

+0

Tienes razón, en mi pregunta debería haber dicho que no estaba seguro de qué temporizador debería usar. Al observar las tres opciones que ha suministrado y al leer MSDN, el Temporizador System.Timers parece el correcto para este caso, ya que en el Tick se deberá realizar una llamada a un objeto creado en el hilo principal. – MrEdmundo

+0

@MrEdmundo: ¿Qué quiere decir exactamente con "el hilo principal"? –

1

El temporizador se ejecutará eficazmente en segundo plano y provocará que se ejecuten eventos en el hilo principal.

+0

Gracias, pensé que ese era el caso, solo necesitaba sonar con alguien. – MrEdmundo

1

No estoy seguro de cómo se implementan los temporizadores en .NET, pero si utilizan la API de Windows para crear un temporizador, el bucle de mensaje de formulario recibe un mensaje WM_TIMER y solo cuando el hilo de formulario no está ocupado puede procesarlo solicitud, por lo que el temporizador se dispararía en el momento adecuado, pero podría estar bloqueando el subproceso de interfaz de usuario. El temporizador se iniciará con la API SetTimer y el sistema operativo se asegurará de publicar un mensaje WM_TIMER.

He comprobado, sólo se System.Windows.Forms.Timer+TimerNativeWindow.StartTimer(Int32) depende de:

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
public static extern IntPtr SetTimer(HandleRef hWnd, int nIDEvent, int uElapse, IntPtr lpTimerFunc); 

Por lo que sólo este temporizador tiene el descrito "problema".

Cuestiones relacionadas