สำหรับ System.Timers.Timer บนเธรดที่แยกจากกันหากไม่ได้ตั้งค่า SynchronizingObject
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 วินาทีหรือไม่:
Main Thread Id: 9
12
12
12
12
12
...
ดังที่เห็น OnDummyTimerFired ถูกดำเนินการบนเธรดของ Workers
ไม่ความซับซ้อนเพิ่มเติม - ถ้าคุณลดช่วงเวลาเพื่อพูด 10 มิลลิวินาที
Main Thread Id: 9
11
13
12
22
17
...
เนื่องจากหากการดำเนินการก่อนหน้าของ OnDummyTimerFired ไม่เสร็จสิ้นเมื่อขีดต่อไปถูกเริ่มทำงาน. NET จะสร้างเธรดใหม่เพื่อทำงานนี้
สร้างความซับซ้อนให้มากขึ้น"คลาส System.Timers.Timer เป็นวิธีง่ายๆในการจัดการกับภาวะที่กลืนไม่เข้าคายไม่ออกนี้ - มันแสดงคุณสมบัติ SynchronizingObject สาธารณะการตั้งค่าคุณสมบัตินี้เป็นอินสแตนซ์ของฟอร์ม Windows (หรือตัวควบคุมบนฟอร์ม Windows) จะช่วยให้มั่นใจได้ว่า ว่าโค้ดในตัวจัดการเหตุการณ์ Elapsed ของคุณทำงานบนเธรดเดียวกันกับที่ SynchronizingObject สร้างอินสแตนซ์ "
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2