ТаймерыTimers

.NET предоставляет два таймера, которые можно использовать в многопоточной среде:.NET provides two timers to use in a multithreaded environment:

Примечание

В некоторых реализациях .NET может содержать дополнительные таймеры:Some .NET implementations may include additional timers:

  • System.Windows.Forms.Timer — компонент Windows Forms, который вызывает событие через определенные интервалы времени.System.Windows.Forms.Timer: a Windows Forms component that fires an event at regular intervals. У этого компонента нет интерфейса пользователя. Он предназначен для однопоточной среды.The component has no user interface and is designed for use in a single-threaded environment.
  • System.Web.UI.Timer — компонент ASP.NET, который выполняет асинхронную или синхронную обратную передачу веб-страницы с регулярными интервалами.System.Web.UI.Timer: an ASP.NET component that performs asynchronous or synchronous web page postbacks at a regular interval.
  • System.Windows.Threading.DispatcherTimer — таймер, интегрированный в очередь Dispatcher, которая обрабатывается с заданными интервалом и приоритетом.System.Windows.Threading.DispatcherTimer: a timer that is integrated into the Dispatcher queue which is processed at a specified interval of time and at a specified priority.

Класс System.Threading.TimerThe System.Threading.Timer class

Класс System.Threading.Timer позволяет непрерывно вызывать делегат через определенные интервалы времени.The System.Threading.Timer class enables you to continuously call a delegate at specified time intervals. Этот класс также можно использовать для планирования одного вызова к делегату через заданный интервал времени.You also can use this class to schedule a single call to a delegate in a specified time interval. Делегат выполняется в потоке ThreadPool.The delegate is executed on a ThreadPool thread.

При создании объекта System.Threading.Timer вы указываете делегат TimerCallback, который определяет метод обратного вызова, необязательный объект состояния, который передается обратному вызову, временную задержку до первого вызова обратного вызова и интервал времени между вызовами обратного вызова.When you create a System.Threading.Timer object, you specify a TimerCallback delegate that defines the callback method, an optional state object that is passed to the callback, the amount of time to delay before the first invocation of the callback, and the time interval between callback invocations. Чтобы отменить ожидающий таймер, вызовите метод Timer.Dispose.To cancel a pending timer, call the Timer.Dispose method.

В следующем примере создается таймер, который вызывает предоставленный делегат в первый раз через одну секунду (1000 миллисекунд), а затем каждые две секунды.The following example creates a timer that calls the provided delegate for the first time after one second (1000 milliseconds) and then calls it every two seconds. Объект состояния в примере используется для подсчета вызовов делегата.The state object in the example is used to count how many times the delegate is called. Таймер останавливается после 10 вызовов.The timer is stopped when the delegate has been called at least 10 times.

using namespace System;
using namespace System::Threading;

ref class TimerState
{
public:
    int counter;
};

ref class Example
{
private:
    static Timer^ timer;

public:
    static void TimerTask(Object^ state)
    {
        Console::WriteLine("{0:HH:mm:ss.fff}: starting a new callback.", DateTime::Now);

        TimerState^ timerState = dynamic_cast<TimerState^>(state);
        Interlocked::Increment(timerState->counter);
    }

    static void Main()
    {
        TimerCallback^ tcb = gcnew TimerCallback(&TimerTask);
        TimerState^ state = gcnew TimerState();
        state->counter = 0;
        timer = gcnew Timer(tcb, state, 1000, 2000);

        while (state->counter <= 10)
        {
            Thread::Sleep(1000);
        }

        timer->~Timer();
        Console::WriteLine("{0:HH:mm:ss.fff}: done.", DateTime::Now);
    }
};

int main()
{
    Example::Main();
}
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    private static Timer timer;

    static void Main(string[] args)
    {
        var timerState = new TimerState { Counter = 0 };

        timer = new Timer(
            callback: new TimerCallback(TimerTask),
            state: timerState,
            dueTime: 1000,
            period: 2000);

        while (timerState.Counter <= 10)
        {
            Task.Delay(1000).Wait();
        }

        timer.Dispose();
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.");
    }

    private static void TimerTask(object timerState)
    {
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.");
        var state = timerState as TimerState;
        Interlocked.Increment(ref state.Counter);
    }

    class TimerState
    {
        public int Counter;
    }
}
Imports System.Threading

Module Program

    Private Timer As Timer

    Sub Main(args As String())

        Dim StateObj As New TimerState
        StateObj.Counter = 0

        Timer = New Timer(New TimerCallback(AddressOf TimerTask), StateObj, 1000, 2000)

        While StateObj.Counter <= 10
            Task.Delay(1000).Wait()
        End While

        Timer.Dispose()
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.")
    End Sub

    Private Sub TimerTask(ByVal StateObj As Object)

        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.")

        Dim State As TimerState = CType(StateObj, TimerState)
        Interlocked.Increment(State.Counter)
    End Sub

    Private Class TimerState
        Public Counter As Integer
    End Class
End Module

Дополнительные сведения и примеры см. в разделе System.Threading.Timer.For more information and examples, see System.Threading.Timer.

Класс System.Timers.TimerThe System.Timers.Timer class

Еще один таймер, который может использоваться в многопоточной среде, — System.Timers.Timer. По умолчанию он порождает событие в потоке ThreadPool.Another timer that can be used in a multithreaded environment is System.Timers.Timer that by default raises an event on a ThreadPool thread.

При создании объекта System.Timers.Timer вы можете указать интервал времени, в котором порождается событие Elapsed.When you create a System.Timers.Timer object, you may specify the time interval in which to raise an Elapsed event. Используйте свойство Enabled, чтобы указать, должен ли таймер порождать событие Elapsed.Use the Enabled property to indicate if a timer should raise an Elapsed event. Если вам нужно, чтобы событие Elapsed вызывалось только один раз по истечении заданного интервала, установите для AutoReset значение false.If you need an Elapsed event to be raised only once after the specified interval has elapsed, set the AutoReset to false. Свойство AutoReset по умолчанию имеет значение true, то есть событие Elapsed вызывается регулярно с интервалом, определенным в свойстве Interval.The default value of the AutoReset property is true, which means that an Elapsed event is raised regularly at the interval defined by the Interval property.

Дополнительные сведения и примеры см. в разделе System.Timers.Timer.For more information and examples, see System.Timers.Timer.

См. также разделSee also