Für System.Timers.Timer in einem separaten Thread, wenn SynchronizingObject nicht festgelegt ist.
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;
}
Ausgabe, die Sie sehen würden, wenn DummyTimer im Intervall von 5 Sekunden ausgelöst würde:
Main Thread Id: 9
12
12
12
12
12
...
Wie zu sehen ist, wird OnDummyTimerFired im Workers-Thread ausgeführt.
Nein, weitere Komplikationen - Wenn Sie das Intervall auf 10 ms reduzieren,
Main Thread Id: 9
11
13
12
22
17
...
Dies liegt daran, dass .NET einen neuen Thread für diesen Job erstellen würde, wenn die vorherige Ausführung von OnDummyTimerFired beim nächsten Häkchen nicht erfolgt.
Erschwerend kommt hinzu: "Die System.Timers.Timer-Klasse bietet eine einfache Möglichkeit, dieses Dilemma zu lösen. Sie macht eine öffentliche SynchronizingObject-Eigenschaft verfügbar. Durch Festlegen dieser Eigenschaft für eine Instanz eines Windows Form (oder eines Steuerelements in einem Windows Form) wird dies sichergestellt dass der Code in Ihrem Elapsed-Ereignishandler auf demselben Thread ausgeführt wird, auf dem das SynchronizingObject instanziiert wurde. "
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2