c\#몇 가지 타이머 구분(timer)
.NET 안의 타이머 에 대해 의문 을 가 진 적 이 있 는 지 모 르 겠 습 니 다.다음은 무 소 스 택 개인의 정리 입 니 다.
2.공식 소개
.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 타 이 머 는 이론 적 으로 단일 스 레 드 의 제한 을 받 지 않 고 짧 은 시간 에 여러 번 촉발 할 수 있 지만 실제 적 으로 스 레 드 탱크 의 제한 을 받 을 수 있 습 니 다.먼저 거 경 에 대한 설명 을 보십시오.null
SynchronizingObject속성 이 있 으 면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)에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.