타이머
.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초(1,000밀리초) 후에 처음 호출한 다음, 2초마다 호출하는 타이머를 만듭니다. 이 예제의 상태 개체는 대리자를 호출한 횟수를 계산하는 데 사용됩니다. 대리자가 10회 이상 호출되면 타이머가 중지됩니다.
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을 참조하십시오.
System.Timers.Timer 클래스
다중 스레드 환경에서 사용할 수 있는 또 다른 타이머는 System.Timers.Timer이며, 기본적으로 ThreadPool 스레드에서 이벤트를 발생시킵니다.
System.Timers.Timer 개체를 만들 때 Elapsed 이벤트가 발생되는 시간 간격을 지정할 수 있습니다. Enabled 속성을 사용하여 타이머에서 Elapsed 이벤트가 발생되어야 하는지 여부를 나타냅니다. 지정된 간격이 지난 후에 Elapsed 이벤트가 한 번만 발생해야 하는 경우 AutoReset을 false
로 설정합니다. AutoReset 속성의 기본값은 true
이며, 이는 즉 Elapsed 이벤트가 Interval 속성에 정의된 간격으로 정기적으로 발생하는 것을 의미합니다.
자세한 내용과 예제를 보려면 System.Timers.Timer을 참조하십시오.
System.Threading.PeriodicTimer 클래스
System.Threading.PeriodicTimer 클래스를 사용하면 지정된 간격의 개별 틱을 대기하고 PeriodicTimer.WaitForNextTickAsync를 호출한 후 작업을 수행할 수 있습니다.
System.Threading.PeriodicTimer 개체를 만들 때 타이머의 각 틱 사이의 시간 길이를 결정하는 TimeSpan을 지정합니다. 콜백을 전달하거나 이전 타이머 클래스에서와 같이 이벤트 처리기를 설정하는 대신, WaitForNextTickAsync가 지정된 간격으로 타이머를 진행할 때까지 기다리면서 범위 내에서 직접 작업을 수행합니다.
WaitForNextTickAsync 메서드는 ValueTask<bool>
를 반환합니다. 타이머가 성공적으로 실행되면 true
이며 PeriodicTimer.Dispose를 호출하여 타이머가 취소된 경우 false
입니다. WaitForNextTickAsync는 필요에 따라 CancellationToken을 허용하므로 취소가 요청되면 TaskCanceledException이 발생합니다.
자세한 내용은 System.Threading.PeriodicTimer를 참조하세요.
참조
.NET