c\#몇 가지 타이머 구분(timer)

1.머리말
.NET 안의 타이머 에 대해 의문 을 가 진 적 이 있 는 지 모 르 겠 습 니 다.다음은 무 소 스 택 개인의 정리 입 니 다.
2.공식 소개
.NET 의 프레임 안에 타이머 가 네 가지 가 있 습 니 다.먼저 마이크로소프트 정부 가 그들의 각자 의 특징 에 대한 소 개 를 살 펴 보 겠 습 니 다.
  • System.Timers.Timer이 벤트 를 촉발 하고 한 개 이상 의 이벤트 수신 기 에서 정기 적 으로 코드 를 실행 합 니 다.클래스 는 다 중 스 레 드 환경 에서 서버 기반 구성 요소 나 서비스 구성 요소 로 사 용 됩 니 다.사용자 인터페이스 가 없어 서 실행 중 에 보이 지 않 습 니 다.
  • System.Threading.Timer고정된 시간 간격 으로 스 레 드 탱크 스 레 드 에 대해 단일 리 셋 방법 을 실행 합 니 다.리 셋 방법 은 타 이 머 를 예화 할 때 정 의 된 것 으로 변경 할 수 없습니다.System.Timers.Timer 류 와 마찬가지 로 다 중 스 레 드 환경 에서 서버 기반 또는 서비스 구성 요소 로 사 용 됩 니 다.사용자 인터페이스 가 없어 서 실행 중 에 보이 지 않 습 니 다.
  • System.Windows.Forms.Timer(.NET Framework 만)이 벤트 를 촉발 하고 하나 이상 의 이벤트 수신 기 에서 코드 를 정기 적 으로 실행 하 는 윈도 우즈 창 구성 요소 입 니 다.구성 요 소 는 단일 스 레 드 환경 에서 사용 하기 위 한 사용자 인터페이스 가 없습니다.UI 스 레 드 에서 실 행 됩 니 다.
  • System.Web.UI.Timer(.NET Framework 만)은 정기 적 으로 비동기 또는 동기 화 웹 페이지 리 턴 을 실행 하 는 ASP.NET 구성 요소 입 니 다.
  • 마이크로소프트 가 개발 자 에 대한 사용 제안 을 살 펴 보 자.
    System.Threading.Timer 는 간단 한 경 형 타이머 로 리 셋 방법 을 사용 하고 스 레 드 탱크 스 레 드 에서 서 비 스 를 제공 합 니 다.Windows 창 과 함께 사용 하 는 것 을 권장 하지 않 습 니 다.사용자 인터페이스 스 레 드 에서 반전 이 일어나 지 않 기 때 문 입 니 다.System.Windows.Forms.Timer 는 Windows 창 에 사용 할 수 있 는 더 좋 은 선택 입 니 다.서버 기반 타이머 기능 에 대해 서 는 System.Timers.Timer 를 사용 하 는 것 을 고려 할 수 있 습 니 다.이 는 사건 을 일 으 키 고 다른 기능 을 가 집 니 다.
    3.개인 체험
    System.Threading.Timer Class
    하나의 기초 류 로 사용 하기 가 그리 좋 지 않 고 각종 용법 이 비교적 원시 적 이 며 사용 하 는 것 이 비교적 적다.
    System.Windows.Forms.Timer Class
    첫 번 째 접촉 은 바로 이것 이다.왜냐하면 직접 winform 을 끌 어 내리 면 되 기 때문이다.사용 하 는 것 이 비교적 많다.나 는 보통 새로 고침 인터페이스의 코드 를 실행 하 는 데 사용한다.이런 코드 들 은 논리 적 인 연산 이 없다.예 를 들 어 인터페이스 에 카운트다운 을 표시 해 야 한다.
    이런 종류의 사용 에서 나 는 두 가지 의혹 을 만 나 공유 한 적 이 있다.
    Q1:Tick 실천 은 새 스 레 드 를 만 들 고 실행 합 니까?
    A1:새로운 스 레 드 를 만 들 지 않 고 항상 메 인 스 레 드 에서 Tick 이 벤트 를 실행 합 니 다.
    Q2:타이머 가 start()순간 에 한 번 촉발 합 니까?아니면 Interval 간격 을 기 다 렸 다가 다시 촉발 합 니까?
    A2:Interval 간격 을 기 다 렸 다가 다시 터치 합 니 다.
    Q3:타이머 start()와 stop()시 Interval 이 누적 되 나 요?
    A3:누적 되 지 않 고 매번 start()에서 다시 시간 을 잽 니 다.
    Q4:만약 Tick 이벤트 내의 코드 가 실행 되 지 않 았 다 면 다음 Tick 시간 이 되면 어떻게 됩 니까?
    A4:완료 되 지 않 은 코드 를 강제로 종료 하지 않 습 니 다.지난번 Tick 이벤트 코드 가 실행 되 지 않 았 다 고 해서 실행 되 지 않 습 니 다.스 택 과 같은 형식 으로 이전에 실행 되 지 않 은 코드 를 쌓 은 다음 에 발생 한 Tick 이벤트 의 코드 를 먼저 실행 하고 완성 되 지 않 은 코드 를 먼저 실행 한 다음 에 실행 합 니 다.구체 적 으로 다음 예제 를 볼 수 있 습 니 다.
    
     public Form1()
     {
      InitializeComponent();
      timerForm.Tick += TimerForm_Tick;
     }
    
     private int num = 1;//    ,         Tick  
    
     private int rowNum = 1;//       ,      AppendText   
    
     private void TimerForm_Tick(object sender, EventArgs e)
     {
      
      string s = $"   {num++} ";
      for (int i = 0; i < 5; i++)
      {
       textBox1.AppendText($"{rowNum++} {s}   i={i}     ID={Thread.CurrentThread.ManagedThreadId.ToString()} \r
    "); Delay(1000); } } private Timer timerForm = new Timer(){Interval = 1000}; private void button1_Click(object sender, EventArgs e) { textBox1.AppendText("button " + Thread.CurrentThread.ManagedThreadId.ToString() + "\r
    "); timerForm.Start(); } public static void Delay(int mimillisecond) { int start = Environment.TickCount; while (Math.Abs(Environment.TickCount - start) < mimillisecond) { System.Windows.Forms.Application.DoEvents(); } }

    System.Timers.Timer Class
    System.Threading.Timer 에 대한 패키지 입 니 다.모두 의뢰 방법 Timer Callback 을 통 해 타이머 이 벤트 를 리 셋 하여 트리거 합 니 다.System.Timers.Timer 의 코드 구현 방식 을 먼저 볼 수 있 습 니 다.
    
      if (!value)
      {
      if (this.timer != null)
      {
       this.cookie = (object) null;
       this.timer.Dispose();
       this.timer = (System.Threading.Timer) null;
      }
      this.enabled = value;
      }
      else
      {
      this.enabled = value;
      if (this.timer == null)
      {
       if (this.disposed)
       throw new ObjectDisposedException(this.GetType().Name);
       int dueTime = (int) Math.Ceiling(this.interval);
       this.cookie = new object();
       this.timer = new System.Threading.Timer(this.callback, this.cookie, dueTime, this.autoReset ? dueTime : -1);
      }
      else
       this.UpdateTimer();
      }
    그러나 System.Threading.Timer 의 속성 과 방법 은 더욱 친절 합 니 다.저 는 보통 사용 할 때 업데이트 인터페이스 를 설계 하지 않 고 이 타이머 류 를 사용 합 니 다.한 가지 설명 할 것 은 Synchronizing Object 속성 을 컨트롤 에 할당 한 후에 이벤트 코드 는 컨트롤 에 호출 을 의뢰 합 니 다.예 를 들 어 timer.Synchronizing Object=this;System.Timers.Timer 내부 가 어떻게 실현 되 었 는 지 볼 수 있 습 니 다.
    
    if (elapsedEventHandler != null)
      {
       if (this.SynchronizingObject != null && this.SynchronizingObject.InvokeRequired)
       {
       this.SynchronizingObject.BeginInvoke(elapsedEventHandler, new object[]
       {
        this,
        elapsedEventArgs
       });
       }
       else
       {
       elapsedEventHandler(this, elapsedEventArgs);
       }
      }
    System.Timers.Timer 타 이 머 는 이론 적 으로 단일 스 레 드 의 제한 을 받 지 않 고 짧 은 시간 에 여러 번 촉발 할 수 있 지만 실제 적 으로 스 레 드 탱크 의 제한 을 받 을 수 있 습 니 다.먼저 거 경 에 대한 설명 을 보십시오.nullSynchronizingObject속성 이 있 으 면ThreadPool스 레 드 에서Elapsed사건 을 일 으 킵 니 다.Elapsed 이벤트 의 처리 지속 시간Interval을 초과 하면 다른 ThreadPool 스 레 드 에서 이 사건 을 다시 일 으 킬 수 있 습 니 다.이런 상황 에서 사건 처리 절 차 는 다시 들 어 갈 수 있어 야 한다.
    1.SynchronizingObject 가 null 이 아 닌 경우 지정 한 대상 스 레 드 에서 이 벤트 를 촉발 하여 단일 스 레 드 로 촉발 합 니 다.System.Windows.Forms.Timer 실행 방식 과 같 습 니 다.
    2.SynchronizingObject 가 null 이 아 닐 때 온라인 프로그램 풀(ThreadPool)에서 이 벤트 를 일 으 키 고 이벤트 내 코드 를 실행 합 니 다.이론 적 으로 중복 불 러 올 수 있 지만 ThreadPool 스 레 드 수의 제한 을 받 을 수 있 습 니 다.예 를 들 어 Threadpool.SetMaxThreads(8,8)는 타이머 트리거 사건 을 동시에 8 번 만 불 러 올 수 있 습 니 다.
    후기
    저 는 지금 타 이 머 를 사용 하고 있 습 니 다.기본적으로 System.Timers.Timer 를 사용 하고 있 습 니 다.제 가 보기 에는 System.Timers.Timer 는 Synchronizing Object 속성 으로 메 인 스 레 드 에서 실 행 될 수 있 고 Synchronizing Object 속성 을 설정 하지 않 아 도 됩 니 다.이벤트 온라인 스 레 드 에서 실 행 됩 니 다.배경 스 레 드 로 사용 하면 제 가 개발 하 는 수 요 를 만족 시 킬 수 있 습 니 다.
    참고 자료
    System.Timers Namespace
    System.Windows.Forms
    System.Threading.ThreadPool Class
    이상 은 c\#몇 가지 타이머(timer)를 구분 하 는 상세 한 내용 입 니 다.c\#타이머(timer)에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기