.NET Framework 에서 타이머 timer 의 단일 스 레 드 와 다 중 스 레 드 사용 설명

6094 단어 타이머timer
규칙 적 인 시간 간격 으로 반복 적 으로 실행 해 야 한다 면 가장 쉬 운 방법 은 타이머(timer)를 사용 하 는 것 이다.아래 의 예 에 비해 타 이 머 는 메모리 와 자원 을 편리 하고 효율적으로 사용 할 수 있다.

new Thread (delegate() {
             while (enabled)
             {
              DoSomeAction();
              Thread.Sleep (TimeSpan.FromHours (24));
             }
            }).Start();
이것 은 하나의 스 레 드 를 영구적 으로 차지 할 뿐만 아니 라 추가 코드 가 없 으 면 DoSomeAction 은 매일 더 늦 은 시간 에 발생 합 니 다.타이머 가 이 문제 들 을 해결 했다.
.NET Framework 는 4 가지 타 이 머 를 제공 합 니 다.다음 두 종 류 는 일반적인 다 중 스 레 드 타이머 입 니 다.
(1)System.Threading.Timer
(2)System.Timers.Timer
다른 두 개 는 전용 단일 스 레 드 타이머 입 니 다.
(3)System.Windows.Forms.Timer(Windows Forms 의 타이머)
(4)System.Windows.Threading.DispatcherTimer(WPF 의 타이머)
다 중 스 레 드 타 이 머 는 더욱 강력 하고 정확 하 며 유연 하 며 단일 스 레 드 타 이 머 는 Windows Forms 와 WPF 컨트롤 을 간단하게 업데이트 하 는 작업 에 있어 안전 하고 편리 합 니 다.
1.다 중 스 레 드 타이머 Permalink
System.Threading.Timer 는 가장 간단 한 다 중 스 레 드 타이머 입 니 다.하나의 구조 방법 과 두 가지 일반적인 방법 만 있 습 니 다.다음 예 에서 한 타 이 머 는 5 초 후에 Tick 방법 으로"tick..."를 인쇄 한 다음 에 사용자 가 Enter 키 를 누 를 때 까지 1 초 에 한 번 씩 인쇄 합 니 다.

using System;
using System.Threading;

class Program
{
 static void Main()
 {
  //      5000ms,     1000ms
  Timer tmr = new Timer (Tick, "tick...", 5000, 1000);
  Console.ReadLine();
  tmr.Dispose();     //             
 }

 static void Tick (object data)
 {
  //              
  Console.WriteLine (data);     //    "tick..."
 }
}

이후 Change 방법 을 사용 하여 타이머 의 시간 간격 을 바 꿀 수 있 습 니 다.타이머 가 한 번 만 터치 하 기 를 원한 다 면 Timeout.Infinite 를 구조 방법의 마지막 매개 변수 로 지정 할 수 있 습 니 다.
.NET Framework 는 System.Timers 네 임 스페이스 에서 같은 이름 의 타이머 클래스 를 제공 합 니 다.이것 은 System.Threading.Timer 를 봉 인 했 을 뿐,완전히 같은 베이스 엔진 을 사용 하 는 전제 에서 추가 적 인 편 의 를 제공한다.다음은 기능 을 추가 하 는 안내 입 니 다.
(1)Component 를 실현 하여 Visual Studio 의 디자이너 에 사용 할 수 있 습 니 다.
(2)Interval 속성 이 Change 방법 을 대체 했다.
(3)Elapsed 사건 이 리 셋 의뢰 를 대체 했다.
(4)Enabled 속성 은 타이머 시작 또는 정지 에 사 용 됩 니 다(기본 값 은 false 입 니 다).
(5)Start 와 Stop 방법 으로 Enabled 속성 에 대해 곤 혹 스 러 워 하지 않도록 합 니 다.
(6)AutoReset 표 지 는 중복 가능 한 이벤트 인지 여 부 를 지정 합 니 다(기본 값 은 true).
SynchronizingObject 속성 은 Invoke 와 BeginInvoke 방법 을 제공 하여 WPF 와 Windows Forms 컨트롤 에서 안전하게 호출 하 는 방법 입 니 다.
이것 은 예 가 있다.

using System;
using System.Timers;  //       Timers     Threading

class SystemTimer
{
 static void Main()
 {
  Timer tmr = new Timer();    //       
  tmr.Interval = 500;
  tmr.Elapsed += tmr_Elapsed;  //         
  tmr.Start();          //      
  Console.ReadLine();
  tmr.Stop();          //      
  Console.ReadLine();
  tmr.Start();          //      
  Console.ReadLine();
  tmr.Dispose();         //        
 }

 static void tmr_Elapsed (object sender, EventArgs e)
 {
  Console.WriteLine ("Tick");
 }
}

다 중 스 레 드 타 이 머 는 스 레 드 풀 을 사용 하여 소량의 스 레 드 서비스 여러 개의 타 이 머 를 허용 합 니 다.리 셋 방법 이나 Elapsed 이벤트 가 매번 다른 스 레 드 에서 실 행 될 수 있다 는 뜻 이다.또한,이전 Elapsed 가 실행 되 었 든 안 되 었 든 Elapsed 는 거의 제때에 작 동 합 니 다.따라서 리 셋 방법 이나 이벤트 프로 세 서 는 스 레 드 가 안전 해 야 합 니 다.
다 중 스 레 드 타이머 의 정 도 는 운영 체제 에 의존 하 며,일반적으로 10-20 ms 구간 에 있다.더 높 은 정밀도 가 필요 하 다 면 로 컬 상호 작용(native interop)을 사용 하여 Windows 멀티미디어 타 이 머 를 호출 하여 정밀 도 를 1ms 로 높 일 수 있 습 니 다.이것 은 winmm.dll 에서 먼저 timeBeginPeriod 를 호출 하여 운영 체제 에 더 높 은 타이머 정밀도 가 필요 하 다 는 것 을 알 리 고 timeSetEvent 를 호출 하여 멀티미디어 타 이 머 를 시작 합 니 다.사용 이 완료 되면 timeKillEvent 정지 타 이 머 를 호출 하고,마지막 으로 timeEndPeriod 알림 운영 체 제 를 호출 하면 더 높 은 타 이 머 정밀도 가 필요 하지 않 습 니 다.키워드 dllimport winmm.dll timesettevent 를 검색 하여 인터넷 에서 완전한 예 를 찾 을 수 있 습 니 다.
2.단일 스 레 드 타이머 Permalink
.NET Framework 는 WPF 와 Windows Forms 응용 프로그램의 스 레 드 보안 문 제 를 없 애기 위해 두 개의 타 이 머 를 제공 합 니 다.
System.Windows.Threading.DispatcherTimer(WPF)
System.Windows.Forms.Timer(Windows Forms)
단일 스 레 드 타 이 머 는 특정한 환경 밖에서 일 할 수 있 도록 설계 되 지 않 았 다.예 를 들 어 Windows 시스템 서비스 응용 프로그램 에서 Windows Forms 타 이 머 를 사용 하면 타이머 이벤트 가 발생 하지 않 습 니 다!
이들 이 노출 된 멤버 들 은 모두 System.Timers.Timer 처럼(Interval,Tick,Start,Stop)사용 방법 도 유사 하 다.그러나 다른 점 은 그 내부 에서 어떻게 일 하 느 냐 에 있다.스 레 드 탱크 를 사용 하여 타이머 이 벤트 를 만 드 는 것 이 아니 라 WPF 와 Windows Forms 타 이 머 는 UI 모델 의 바 텀 메시지 순환 메커니즘(message pumping mechanism)에 의존 합 니 다.Tick 이벤트 가 항상 이 타이머 의 스 레 드 를 만 드 는 것 을 의미 합 니 다.일반적인 프로그램 에서 모든 UI 요소 와 컨트롤 을 관리 하 는 스 레 드 입 니 다.이것 은 많은 장점 이 있다.
단일 스 레 드 타 이 머 는 안전 하 며,Windows Forms controls 나 WPF 를 업데이트 하 는 간단 한 작업 에 더욱 편리 합 니 다.WPF 나 Windows Forms 에서 안전 한 호출 방법의 SynchronizingObject 대상 입 니 다.
단일 스 레 드 타 이 머 는 실행 환경 에 속 하 는 타이머 로 설계 되 었 습 니 다.Windows 서비스 프로그램 에서 Windows Forms 의 Timer 를 사용 하면 timer 이벤트 가 트리거 되 지 않 고 해당 하 는 환경 에서 만 트리거 됩 니 다.
System.Timers.Timer 와 마찬가지 로 같은 구성원(Interval,Tick,Start,Stop)을 제 공 했 지만 내부 작업 원리 가 다 르 기 때문에 WPF 와 Windows Forms 의 타 이 머 는 스 레 드 탱크 에서 메 시 지 를 만 드 는 메커니즘 을 대체 하기 위해 메시지 순환 메커니즘 을 사용한다.
너 는 라인 의 안전 을 고려 할 필요 가 없다.
새 틱 은 이전 틱 이 실행 되 기 전 까지 실행 되 지 않 습 니 다.
Control.Invoke 나 Dispatcher.Invoke 를 호출 하지 않 고 Tick 시간 이벤트 처리 코드 에서 UI 컨트롤 을 직접 업데이트 할 수 있 습 니 다.
이 타 이 머 를 사용 하 는 프로그램 이 진정한 다 중 스 레 드 가 아니 라 병행 되 지 않 는 다 는 것 을 깨 달 을 때 까지 믿 을 수 없 을 정도 로 좋다.하나의 스 레 드 는 모든 타이머 에 서 비 스 를 제공 하고 UI 이 벤트 를 처리 합 니 다.이것 은 단일 스 레 드 타이머 의 단점 을 가 져 왔 다.
Tick 이벤트 프로세서 가 빨리 실행 되 지 않 으 면 UI 가 응답 을 잃 습 니 다.
이 때문에 WPF 와 Windows Forms 타 이 머 는 작은 작업 에 만 적 용 됩 니 다.보통 UI 모양 을 업데이트 하 는 작업(예 를 들 어 시계 나 카운트다운 표시)입 니 다.그렇지 않 으 면 다 중 스 레 드 타이머 가 필요 합 니 다.
정밀도 에 있어 서 단일 스 레 드 타 이 머 는 다 중 스 레 드 타 이 머 와 유사 하지만 보통 정밀도 가 낮 습 니 다.다른 UI 요청(또는 다른 타이머 이벤트)에 의 해 지연 되 기 때 문 입 니 다.
단일 스 레 드 타 이 머 는 Windows 메시지 순환 을 기반 으로 프로그램 이 타 이 머 를 동기 화 할 것 입 니 다.UI 인터페이스 가 상대 적 으로 느 린 것 을 발견 할 수 있 습 니 다.이 문 제 를 해결 하 는 방법 은 다 중 스 레 드 타 이 머 를 사용 하 는 것 이다.
단일 스 레 드 타이머 의 단점:Tick 이벤트 의 처리 코드 가 매우 빨리 실행 되 지 않 는 한 UI 인터페이스 가 느 려 집 니 다.그래서 WPF 와 Windows Forms 의 타 이 머 는 작은 작업,특히 인터페이스 업데이트 작업 에 적합 합 니 다.예 를 들 어 시계 와 계수 표시.그렇지 않 으 면 다 중 스 레 드 타이머 가 필요 합 니 다.

좋은 웹페이지 즐겨찾기