.NET은 다중 스레드 환경에서 사용할 세 가지 타이머를 제공합니다.
- System.Threading.Timer가 ThreadPool 스레드에서 단일 콜백 메서드를 정기적으로 실행합니다.
- System.Timers.Timer는 기본적으로 정기적으로 ThreadPool 스레드에서 이벤트를 발생시킵니다.
- System.Threading.PeriodicTimer- 호출자가 타이머의 개별 틱을 대기한 후 작업을 수행할 수 있도록 합니다.
비고
일부 .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 시켜야 하는지 여부를 나타내려면 이 속성을 사용합니다. 지정된 간격이 경과한 후 이벤트를 한 번만 발생시켜야 하는 경우, Elapsed을 AutoReset으로 설정합니다.
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을 반환합니다.
WaitForNextTickAsync는 CancellationToken을(를) 선택적으로 허용하며, 이는 취소가 요청될 때 TaskCanceledException 결과를 초래합니다.
자세한 내용은 System.Threading.PeriodicTimer를 참조하세요.
참고하십시오
.NET