Используйте класс System.Threading.Timer.
System.Windows.Forms.Timer предназначен главным образом для использования в одном потоке, обычно в потоке пользовательского интерфейса Windows Forms.
Существует также класс System.Timers, добавленный на ранних этапах разработки .NET Framework. Однако обычно рекомендуется вместо этого использовать класс System.Threading.Timer, так как в любом случае это всего лишь оболочка для System.Threading.Timer.
Также рекомендуется всегда использовать статический (совместно используемый в VB.NET) System.Threading.Timer, если вы разрабатываете службу Windows и вам требуется периодический запуск таймера. Это позволит избежать преждевременной сборки мусора вашего объекта таймера.
Вот пример таймера в консольном приложении:
using System;
using System.Threading;
public static class Program
{
public static void Main()
{
Console.WriteLine("Main thread: starting a timer");
Timer t = new Timer(ComputeBoundOp, 5, 0, 2000);
Console.WriteLine("Main thread: Doing other work here...");
Thread.Sleep(10000); // Simulating other work (10 seconds)
t.Dispose(); // Cancel the timer now
}
// This method's signature must match the TimerCallback delegate
private static void ComputeBoundOp(Object state)
{
// This method is executed by a thread pool thread
Console.WriteLine("In ComputeBoundOp: state={0}", state);
Thread.Sleep(1000); // Simulates other work (1 second)
// When this method returns, the thread goes back
// to the pool and waits for another task
}
}
Из книги CLR Via C # Джеффа Рихтера. Кстати, эта книга описывает обоснование трех типов таймеров в главе 23, настоятельно рекомендуется.