Untuk System.Timers.Timer, di utas terpisah, jika SynchronizingObject tidak disetel.
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;
}
Output Anda akan melihat jika DummyTimer diaktifkan pada interval 5 detik:
Main Thread Id: 9
12
12
12
12
12
...
Jadi, seperti yang terlihat, OnDummyTimerFired dijalankan pada thread Pekerja.
Tidak, komplikasi lebih lanjut - Jika Anda mengurangi interval menjadi 10 ms,
Main Thread Id: 9
11
13
12
22
17
...
Ini karena jika eksekusi prev dari OnDummyTimerFired tidak dilakukan saat centang berikutnya diaktifkan, maka .NET akan membuat utas baru untuk melakukan pekerjaan ini.
Lebih rumit lagi, "Kelas System.Timers.Timer menyediakan cara mudah untuk menangani dilema ini — ini memperlihatkan properti SynchronizingObject publik. Menyetel properti ini ke instance Formulir Windows (atau kontrol pada Formulir Windows) akan memastikan bahwa kode dalam penangan kejadian Berlalu Anda berjalan pada utas yang sama dengan tempat pembuatan instance SynchronizingObject. "
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2