2009-04-08 3 views
13

Ho un aspetto di messaggistica della mia applicazione utilizzando Jabber-net (un XMPP library.)I timer .NET vengono eseguiti in modo asincrono?

Quello che mi piacerebbe fare, se per qualche motivo la connessione al server è finita, è continuare a provare per collegare ogni minuto o giù di lì.

Se avvio un timer per attendere un periodo di tempo prima del prossimo tentativo, il timer viene eseguito in modo asincrono e l'evento di tick risultante si unisce al thread principale, oppure dovrei iniziare il mio thread e avviare il timer da lì dentro?

risposta

35

Che tipo di timer stai utilizzando?

  • System.Windows.Forms.Timer eseguirà nel thread UI
  • System.Timers.Timer esegue in un thread pool di thread a meno che non si specifica un SynchronizingObject
  • System.Threading.Timer esegue la sua richiamata in un thread pool di thread

In tutto casi, il timer stesso sarà asincrono - non "prenderà" un thread finché non scocca.

+0

Ricordare se non si sta utilizzando System.Windows.Forms.Timer che l'accesso a un controllo genera un'eccezione a meno che non si esegua il controllo e l'invocazione InvokeRequired appropriati. –

+0

Hai ragione, nella mia domanda avrei dovuto dire che non ero sicuro di quale timer dovrei usare. Guardando le tre opzioni che hai fornito e leggendo MSDN, System.Timers.Timer sembra quello giusto per questo caso come nel Tick che una chiamata dovrà essere fatta a un oggetto creato nel thread principale. – MrEdmundo

+0

@MrEdmundo: cosa intendi esattamente per "il filo conduttore"? –

1

Il timer verrà eseguito in modo efficace in background e farà sì che gli eventi nel thread principale vengano eseguiti.

+0

Grazie, ho pensato che fosse il caso, solo bisogno di suonare con qualcuno. – MrEdmundo

1

Non sono sicuro di come sono implementati i Timer in .NET, ma se usano l'API di Windows per creare un timer il ciclo dei messaggi del form riceve un messaggio WM_TIMER e solo quando il thread del modulo non è occupato può farlo richiesta, quindi il timer si attiva al momento giusto, ma è possibile che si stia bloccando il thread dell'interfaccia utente. Il timer verrà avviato con l'API SetTimer e il sistema operativo assicurerà di pubblicare un messaggio WM_TIMER.

Ho controllato, solo System.Windows.Forms.Timer+TimerNativeWindow.StartTimer(Int32) dipende:

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

Quindi solo questo timer ha il descritto "problema".