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); // 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;
}
यदि आप DummyTimer को 5 सेकंड के अंतराल पर निकालते हैं, तो आउटपुट देखें:
Main Thread Id: 9
12
12
12
12
12
...
इसलिए, जैसा कि देखा गया है, OnDummyTimerFired को वर्कर्स थ्रेड पर निष्पादित किया जाता है।
नहीं, आगे की जटिलता - यदि आप 10 एमएस कहने के लिए अंतराल को कम करते हैं,
Main Thread Id: 9
11
13
12
22
17
...
ऐसा इसलिए होता है क्योंकि यदि अगले टिक को निकाल दिए जाने पर OnDummyTimerFired का प्रचलित निष्पादन नहीं किया जाता है, तो .NET इस काम को करने के लिए एक नया थ्रेड तैयार करेगा।
आगे चीजों की शिकायत करते हुए, "System.Timers.Timer वर्ग इस दुविधा से निपटने का एक आसान तरीका प्रदान करता है - यह एक सार्वजनिक सिंक्रोनाइज़िंगऑब्जेक्ट प्रॉपर्टी को उजागर करता है। इस प्रॉपर्टी को विंडोज फॉर्म (या विंडोज फॉर्म पर एक नियंत्रण) की स्थापना सुनिश्चित करेगा। आपके एलैप किए गए ईवेंट हैंडलर का कोड उसी थ्रेड पर चलता है, जिस पर SynchronizingObject का त्वरित मूल्यांकन किया गया था। "
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2