Dla System.Timers.Timer w oddzielnym wątku, jeśli SynchronizingObject nie jest ustawiony.
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;
}
Na wyjściu zobaczysz, czy DummyTimer uruchomił się co 5 sekund:
Main Thread Id: 9
12
12
12
12
12
...
Tak więc, jak widać, OnDummyTimerFired jest wykonywany w wątku Workers.
Nie, dalsze komplikacje - jeśli zmniejszysz interwał do 10 ms,
Main Thread Id: 9
11
13
12
22
17
...
Dzieje się tak, ponieważ jeśli poprzednie wykonanie OnDummyTimerFired nie zostanie wykonane po uruchomieniu następnego ticka, platforma .NET utworzy nowy wątek do wykonania tego zadania.
Co jeszcze bardziej komplikuje sprawę , „Klasa System.Timers.Timer zapewnia łatwy sposób rozwiązania tego dylematu - ujawnia publiczną właściwość SynchronizingObject. Ustawienie tej właściwości na wystąpienie formularza systemu Windows (lub kontrolkę w formularzu systemu Windows) zapewni że kod w programie obsługi zdarzeń Elapsed działa w tym samym wątku, w którym utworzono wystąpienie obiektu SynchronizingObject. "
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2