[C\#].NET 의 몇 가지 Timer 사용 실례

5965 단어 asp.nettimer
이 블 로 그 는.NET 의 4 개의 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);
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기