[C\#].NET 의 몇 가지 Timer 사용 실례
1. System.Threading.Timer
public Timer(TimerCallback callback, object state, int dueTime, int period);
콜백 의뢰 는 period 시간 간격 으로 반복 적 으로 실 행 됩 니 다.state 매개 변 수 는 콜백 의뢰 에서 처리 하고 싶 은 대상 에 게 전 달 될 수 있 습 니 다.DueTime 표 지 는 얼마 후에 콜백 이 실 행 됩 니까?period 표 지 는 콜백 을 얼마나 자주 실행 합 니까?
using System.Threading;
// System.Threading.Timer
Timer timer = new Timer(delegate
{
Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"Is Thread Pool: {Thread.CurrentThread.IsThreadPoolThread}");
Console.WriteLine("Timer Action.");
},
null,
2000,
1000
);
Console.WriteLine("Main Action.");
Console.WriteLine($"Main Thread: {Thread.CurrentThread.ManagedThreadId}");
Console.ReadLine();
Timer 리 턴 방법 은 다른 ThreadPool 의 새로운 스 레 드 에서 실 행 됩 니 다.2. System.Timers.Timer
System.Timers.Timer 는 System.Threading.Timer 에 비해 더 많은 속성 을 제공 합 니 다.
Interval 은 Elapsed 이 벤트 를 실행 할 시간 간격 을 지정 합 니 다.
Elapsed 에서 정기 적 으로 실행 할 이 벤트 를 지정 합 니 다.
Start/Stop Timer 에 사용 가능;
타이머 시작
스 톱 스 톱 타이머
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500;
timer.Elapsed += delegate
{
Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"Is Thread Pool: {Thread.CurrentThread.IsThreadPoolThread}");
Console.WriteLine("Timer Action");
timer.Stop();
};
timer.Start();
Console.WriteLine("Main Action.");
Console.WriteLine($"Main Thread: {Thread.CurrentThread.ManagedThreadId}");
Console.ReadLine();
Timer Elapsed 정기 임 무 는 ThreadPool 의 스 레 드 에서 실 행 됩 니 다.3. System.Windows.Forms.Timer
Interval 은 Elapsed 이 벤트 를 실행 할 시간 간격 을 지정 합 니 다.
Tick 정기 적 으로 실행 되 는 이벤트 지정 하기;
Start/Stop Timer 에 사용 가능;
타이머 시작
스 톱 스 톱 타이머
System.Windows.Forms.Timer 를 사용 하여 창 에 있 는 레이 블 내 시간 을 업데이트 합 니 다.
using System.Windows.Forms;
public Form1()
{
InitializeComponent();
this.Load += delegate
{
Timer timer = new Timer();
timer.Interval = 500;
timer.Tick += delegate
{
System.Diagnostics.Debug.WriteLine($"Timer Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
System.Diagnostics.Debug.WriteLine($"Is Thread Pool: {System.Threading.Thread.CurrentThread.IsThreadPoolThread}");
this.lblTimer.Text = DateTime.Now.ToLongTimeString();
};
timer.Start();
System.Diagnostics.Debug.WriteLine($"Main Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
};
}
Timer Tick 이벤트 에서 실 행 된 이벤트 스 레 드 는 주 창의 스 레 드 와 같 으 며,UI 를 업데이트 하기 위해 새 스 레 드(또는 ThreadPool 의 스 레 드)를 만 들 지 않 았 습 니 다.다음은 코드 를 변경 합 니 다.System.Timers.Timer 를 사용 하여 UI 의 시간 을 업데이트 합 니 다.코드 는 다음 과 같 습 니 다.
public Form1()
{
InitializeComponent();
this.Load += delegate
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500;
timer.Elapsed += delegate
{
System.Diagnostics.Debug.WriteLine($"Timer Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
System.Diagnostics.Debug.WriteLine($"Is Thread Pool: {System.Threading.Thread.CurrentThread.IsThreadPoolThread}");
this.lblTimer.Text = DateTime.Now.ToLongTimeString();
};
timer.Start();
System.Diagnostics.Debug.WriteLine($"Main Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
};
}
익숙 한 잘못.Label 은 UI 스 레 드 로 만 들 어 졌 기 때문에 이 를 수정 하려 면 UI 스 레 드 에서 해 야 합 니 다.System.Timers.Timer 에서 Elasped 실행 은 ThreadPool 에서 새로 만 든 스 레 드 에서 실 행 됩 니 다.그래서 위의 잘못 이 있 을 수 있 습 니 다.
4. System.Windows.Threading.DispatcherTimer
속성 과 방법 은 System.Windows.Forms.Timer 와 유사 합 니 다.
using System.Windows.Threading;
public MainWindow()
{
InitializeComponent();
this.Loaded += delegate
{
//DispatcherTimer
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Start();
Debug.WriteLine($"Main Thread Id: {Thread.CurrentThread.ManagedThreadId}");
timer.Tick += delegate
{
tbTime.Text = DateTime.Now.ToLongTimeString();
Debug.WriteLine($"Timer Thread Id: {Thread.CurrentThread.ManagedThreadId}");
timer.Stop();
};
};
}
Dispatcher Timer 에서 Tick 이벤트 가 주 스 레 드 에서 실 행 됩 니 다.
Dispatcher Timer 를 사용 할 때 주의해 야 할 점 이 있 습 니 다.Dispatcher Timer 의 Tick 사건 은 Dispatcher 대기 열 에 있 기 때문에 시스템 이 높 은 부하 에 있 을 때 Interval 시간 대 에 실 행 될 수 없고 경미 한 지연 이 있 을 수 있 지만 Tick 의 실행 이 Interval 설정 보다 빠 르 지 않 을 것 이 라 고 보장 할 수 있 습 니 다.Tick 실행 시간 에 대한 정확성 이 높 으 면 Dispatcher Timer 의 priority 를 설정 할 수 있 습 니 다.예 를 들 면:
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Send);
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
작업 중 문제 해결 - (win 2003 asp. net) Session 과 페이지 전송 방법 으로 해결 방안 을 정상적으로 사용 할 수 없습니다.또한 F 는 처음에 우리 의 BP & IT 프로젝트 팀 이 Forms 폼 검증 을 사용 했다 고 판단 할 수 있 습 니 다. 페이지 를 뛰 어 넘 는 것 은http://hr.bingjun.cc/MyTask/MyTas...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.