SynchronizingObject ayarlanmamışsa, ayrı iş parçacığında System.Timers.Timer için.
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);
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;
}
DummyTimer 5 saniye aralıklarla tetiklendiğinde göreceğiniz çıktı:
Main Thread Id: 9
12
12
12
12
12
...
Görüldüğü gibi OnDummyTimerFired, Workers iş parçacığında çalıştırılır.
Hayır, daha fazla karmaşıklık - Aralığı 10 ms olarak kısaltırsanız,
Main Thread Id: 9
11
13
12
22
17
...
Bunun nedeni, OnDummyTimerFired'ın önceki çalıştırma işleminin bir sonraki tick çalıştırıldığında yapılmaması durumunda, .NET'in bu işi yapmak için yeni bir iş parçacığı oluşturmasıdır.
İşleri daha da karmaşık hale getiren "System.Timers.Timer sınıfı, bu ikilemle başa çıkmak için kolay bir yol sağlar - genel bir SynchronizingObject özelliğini ortaya çıkarır. Bu özelliği bir Windows Form örneğine (veya bir Windows Formundaki bir kontrole) ayarlamak, Elapsed olay işleyicinizdeki kodun, SynchronizingObject öğesinin başlatıldığı aynı iş parçacığında çalıştığını.
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2