Pour System.Timers.Timer, sur un thread distinct, si SynchronizingObject n'est pas défini.
static System.Timers.Timer DummyTimer = null;
static void Main(string[] args)
{
try
{
Console.WriteLine("Main Thread Id: " + System.Threading.Thread.CurrentThread.ManagedThreadId);
DummyTimer = new System.Timers.Timer(1000 * 5); // 5 sec interval
DummyTimer.Enabled = true;
DummyTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnDummyTimerFired);
DummyTimer.AutoReset = true;
DummyTimer.Start();
Console.WriteLine("Hit any key to exit");
Console.ReadLine();
}
catch (Exception Ex)
{
Console.WriteLine(Ex.Message);
}
return;
}
static void OnDummyTimerFired(object Sender, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
return;
}
Sortie vous verriez si DummyTimer s'est déclenché à 5 secondes d'intervalle:
Main Thread Id: 9
12
12
12
12
12
...
Ainsi, comme on le voit, OnDummyTimerFired est exécuté sur le thread Workers.
Non, complication supplémentaire - Si vous réduisez l'intervalle à 10 ms,
Main Thread Id: 9
11
13
12
22
17
...
En effet, si l'exécution précédente d'OnDummyTimerFired n'est pas effectuée lors du déclenchement suivant, .NET créerait un nouveau thread pour effectuer ce travail.
Pour compliquer encore les choses, "La classe System.Timers.Timer fournit un moyen simple de résoudre ce dilemme: elle expose une propriété SynchronizingObject publique. La définition de cette propriété sur une instance d'un Windows Form (ou un contrôle sur un Windows Form) garantira que le code de votre gestionnaire d'événements Elapsed s'exécute sur le même thread sur lequel le SynchronizingObject a été instancié. "
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2