Для 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 выполняется в потоке Workers.
Нет, дальнейшее усложнение - если вы уменьшите интервал до 10 мс,
Main Thread Id: 9
11
13
12
22
17
...
Это связано с тем, что если предыдущее выполнение OnDummyTimerFired не было выполнено при следующем запуске тика, .NET создаст новый поток для выполнения этой работы.
Еще больше усложняя ситуацию: «Класс System.Timers.Timer обеспечивает простой способ решения этой дилеммы - он предоставляет общедоступное свойство SynchronizingObject. Установка этого свойства в экземпляр Windows Form (или элемент управления в Windows Form) гарантирует что код в вашем обработчике событий Elapsed выполняется в том же потоке, в котором был создан экземпляр SynchronizingObject ".
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2