Pour Le Système.Les minuteries.À rebours, sur le thread, si SynchronizingObject n'est pas définie.
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 que vous verriez si DummyTimer tiré à 5 secondes d'intervalle:
Main Thread Id: 9
12
12
12
12
12
...
Donc, comme on le voit, OnDummyTimerFired est exécutée sur les Travailleurs fil.
Non, complication supplémentaire - Si vous réduisez l'intervalle de 10 ms,
Main Thread Id: 9
11
13
12
22
17
...
C'est parce que si prev exécution de OnDummyTimerFired n'est pas fait lors de la prochaine tique est tiré, puis .NET serait de créer un nouveau thread pour faire ce travail.
Compliquant encore plus les choses, "Le Système de.Les minuteries.Classe Timer fournit un moyen facile de traiter ce dilemme, il expose un public SynchronizingObject de la propriété. La définition de cette propriété à une instance d'un Formulaire Windows (ou d'un contrôle sur un Formulaire Windows) permettra de s'assurer que le code dans votre Écoulé gestionnaire d'événement s'exécute sur le même thread sur lequel le SynchronizingObject a été instancié."
(On aime compliquer les choses n'est-ce pas? Tout ce qui est nécessaire est un god damn timer - la Première Règle lorsque vous enseignez les Modèles de Conception devraient être la "Simplicité")
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2