다음을 통해 공유


타이머

.NET은 다중 스레드 환경에서 사용할 세 가지 타이머를 제공합니다.

비고

일부 .NET 구현에는 추가 타이머가 포함될 수 있습니다.

  • System.Windows.Forms.Timer: 정기적으로 이벤트를 발생시키는 Windows Forms 구성 요소입니다. 구성 요소에는 사용자 인터페이스가 없으며 단일 스레드 환경에서 사용하도록 설계되었습니다.
  • System.Web.UI.Timer: 비동기 또는 동기 웹 페이지 포스트백을 정기적으로 수행하는 ASP.NET 구성 요소입니다.
  • System.Windows.Threading.DispatcherTimer: 지정된 시간 간격 및 지정된 우선 순위로 처리되는 큐에 통합 Dispatcher 된 타이머입니다.

'System.Threading.Timer' 클래스

클래스 System.Threading.Timer 를 사용하면 지정된 시간 간격으로 대리자를 지속적으로 호출할 수 있습니다. 이 클래스를 사용하여 지정된 시간 간격으로 대리자를 단일 호출하도록 예약할 수도 있습니다. 대리자는 ThreadPool 스레드에서 실행됩니다.

개체를 System.Threading.Timer 만들 때 콜백 메서드를 정의하는 대리자, 콜백에 전달되는 선택적 상태 개체, 콜백의 첫 번째 호출 전 지연 시간 및 콜백 호출 사이의 시간 간격을 지정 TimerCallback 합니다. 보류 중인 타이머를 취소하려면 메서드를 호출합니다 Timer.Dispose .

다음 예제에서는 제공된 대리자를 1초(1000밀리초) 후 처음으로 호출한 다음 2초마다 호출하는 타이머를 만듭니다. 예제의 상태 개체는 대리자가 호출되는 횟수를 계산하는 데 사용됩니다. 대리자를 10번 이상 호출하면 타이머가 중지됩니다.

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.

System.Timers.Timer 클래스

다중 스레드 환경에서 사용할 수 있는 또 다른 타이머는 System.Timers.Timer 기본적으로 스레드에서 ThreadPool 이벤트를 발생시키는 것입니다.

개체를 System.Timers.Timer 만들 때 이벤트를 발생 Elapsed 시키는 시간 간격을 지정할 수 있습니다. 타이머가 Enabled 이벤트를 발생 Elapsed 시켜야 하는지 여부를 나타내려면 이 속성을 사용합니다. 지정된 간격이 경과한 후 이벤트를 한 번만 발생시켜야 하는 경우, ElapsedAutoReset으로 설정합니다. AutoReset 속성의 기본값은 true입니다. 이는 Elapsed 속성에 의해 정의된 간격에 따라 Interval 이벤트가 정기적으로 발생함을 의미합니다.

자세한 내용 및 예제는 다음을 참조하세요 System.Timers.Timer.

System.Threading.PeriodicTimer 클래스

클래스 System.Threading.PeriodicTimer 를 사용하면 지정된 간격의 개별 틱을 대기하고 호출 PeriodicTimer.WaitForNextTickAsync후 작업을 수행할 수 있습니다.

개체를 System.Threading.PeriodicTimer 만들 때 타이머의 각 틱 사이의 시간 길이를 결정하는 개체를 지정 TimeSpan 합니다. 콜백을 전달하거나 이전 타이머 클래스에서와 같이 이벤트 처리기를 설정하는 대신 지정된 간격으로 타이머를 진행하기 위해 대기하면서 WaitForNextTickAsync 범위에서 직접 작업을 수행합니다.

타이머가 성공적으로 시작되면 WaitForNextTickAsync 메서드는 ValueTask<bool>을 반환하고, 타이머가 true를 호출하여 취소된 경우 false을 반환합니다. WaitForNextTickAsyncCancellationToken을(를) 선택적으로 허용하며, 이는 취소가 요청될 때 TaskCanceledException 결과를 초래합니다.

자세한 내용은 System.Threading.PeriodicTimer를 참조하세요.

참고하십시오