C의 타이머 클래스에 대해# C#에는 세 개의 타이머 클래스가 있습니다.
1. System.Windows.Forms에서 정의하기
2. System.Threading.Timer 클래스에서 정의됨
3. System.Timers.Timer 클래스에서 정의됨
System.Windows.Forms.Timer는 WinForm에 적용되며, 이는 VB나 Delphi의 타이머 제어와 유사한 Windows 메시지 메커니즘을 통해 구현되며, 내부적으로는 API SetTimer를 사용해 구현됩니다. 주요 단점은 타이밍이 정확하지 않고, 메시지 루프가 있어야 하는데, 이는 콘솔 애플리케이션에는 제공되지 않는다는 점입니다.
System.Timers.Timer는 System.Threading.Timer와 매우 유사하며, .NET 스레드 풀을 통해 구현되어 가볍고 정확한 타이밍을 제공하고, 애플리케이션과 메시지에 대한 특별한 요구사항이 없습니다. System.Timers.Timer는 WinForm에도 적용할 수 있어 위의 타이머 컨트롤을 완전히 대체할 수 있습니다. 단점은 직접 드래그 앤 드롭을 지원하지 않고 수동 코딩이 필요하다는 점입니다.
예시:
System.Timers.Timer 클래스를 사용하세요
System.Timers.Timer t = new System.Timers.Timer(10000); 타이머 클래스를 인스턴스화하고 간격을 10,000밀리초로 설정하세요.
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); 시간이 다 되면 이벤트를 실행하고;
t.AutoReset = true; 한 번(false) 또는 항상 실행할지(true) 설정;
t.Enabled = 참; System.Timers.Timer.Elapsed 이벤트를 실행할지 여부;
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("알겠어요!");
}
C#에서 세 개의 타이머 사용 간의 유사점과 차이점에 대한 실험적 분석
http://dotnet.chinaitlab.com/CSharp/737740.html
C#에는 세 가지 유형의 타이머가 있습니다:
1. 윈도우 기반 표준 타이머 (System.Windows.Forms.Timer)
2. 서버 기반 타이머 (System.Timers.Timer)
3. 스레드 타이머 (System.Threading.Timer)
세 타이머 간의 유사점과 차이점, 특히 스레드 관련 부분을 분석하기 위해 작은 실험들을 살펴보겠습니다.
실험 예시 스크린샷:
1. 표준 윈도우 기반 타이머 (System.Windows.Forms.Timer)
먼저 주목할 점은 Windows Timer가 단일 스레드 환경을 위해 설계되었다는 것입니다
이 타이머는 Visual Basic 1.0 버전부터 제품에 포함되어 있으며 거의 변함이 없습니다
이 타이머가 가장 사용하기 쉽습니다. 툴박스에서 타이머 컨트롤을 폼으로 드래그해서 이벤트나 구간 같은 속성을 설정하면 됩니다
실험 결과는 단일 스레딩의 특성과도 완전히 일치합니다:
1. 이 타이머가 시작되면 하위 자식 스레드 ID 목록에 자식 스레드 ID가 표시되며, 이는 메인 스레드 ID와 동일합니다
private void formsTimer_Tick(object sender, EventArgs e)
{
i++;
lblSubThread.Text += "서브스레드 실행, 스레드 ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. 메인 스레드가 5초간 일시정지되면 자식 스레드가 실행을 일시정지하고, 이전에 일시 중지된 자식 스레드가 5초 후에도 실행되지 않으면 다음 자식 스레드가 직접 실행됩니다(즉, 몇 줄의 값을 출력합니다).
System.Threading.Thread.Sleep(5000);
3. 자식 프로세스의 이벤트를 5초간 일시정지하면 메인 창이 5초간 반응하지 않습니다
4. 스레드 정적 변수를 정의합니다:
[스레드 잡음]
개인 정적 정형 i = 0;
각 하위 스레드 이벤트에 하나씩 추가한 후, 스레드 정적 변수 값을 클릭하면 증가한 i 값을 얻습니다
2. 서버 기반 타이머 (System.Timers.Timer)
System.Timers.Timer는 폼에 의존하지 않으며, 스레드 풀에서 스레드를 깨우고, 서버 환경에서 실행되도록 최적화된 전통적인 타이머의 업데이트 버전입니다
VS2005 툴박스에는 기본 제공되는 제어 장치가 없으며, 이 타이머를 사용하려면 수동으로 코딩해야 합니다
사용하는 방법은 두 가지가 있습니다.
1. SynchronizingObject 속성을 통해 폼에 부착
System.Timers.Timer timersTimer = new System.Timers.Timer();
timersTimer.Enabled = false;
타이머 타임랜 = 100;
timersTimer.Elapsed += new System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = this;
이렇게 실험은 표준 Windows 기반 타이머와 거의 동일하게 작동하지만, 위의 두 번째 실험에서는 서브스레드 실행도 일시정지되지만, 5초 후에는 이전에 대기열에 있던 모든 작업이 실행됩니다(즉, 몇 줄의 값이 빠지지 않습니다).
2. SynchronizingObject 속성을 사용하지 마세요
이 메서드는 다중 스레드로, 시작 자식 스레드와 메인 폼이 같은 스레드에 있지 않습니다. 하지만 문제도 있습니다: 서브스레드가 별도의 스레드이기 때문에 폼의 컨트롤에 접근할 수 없고, 프록시를 통해서만 접근할 수 있습니다:
delegate void SetTextCallback(문자열 텍스트);
출처: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (턴) C#_dash_Sina 블로그에서 세 타이머 객체 비교
。
。
void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = "자식 스레드 실행, thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = 새로운 SetTextCallback(SetText);
이거. Invoke(d, 새 객체[] { 텍스트 });
i++;
}
private void SetText(문자열 텍스트)
{
lblSubThread.Text += 텍스트;
}
이렇게 하면 다시 실험에서 다음과 같은 결과를 얻을 수 있습니다:
1. 이 타이머가 시작되면 하위 하위 스레드 ID 목록에 자식 스레드 ID가 표시되며, 메인 스레드 ID와는 다릅니다
2. 메인 스레드를 클릭해 5초간 일시정지하면, 서브 스레드는 계속 실행됩니다(인터페이스에서는 보이지 않을 수 있지만, 서브스레드 내 파일을 출력하면 쉽게 확인할 수 있습니다)
3. 자식 프로세스의 이벤트를 5초간 일시정지해도 메인 창이 반응하지 않게 됩니다
4. 서브스레드 이벤트에서 매번 스레드 정적 변수에 1을 추가한 후, 스레드 정적 변수의 가치가 0인지 클릭하세요(메인 창에서 스레드 정적 변수는 변경되지 않습니다).
3. 스레드 타이머 (System.Threading.Timer)
스레드 타이머는 폼에 의존하지 않고, 이벤트 대신 콜백 메서드를 사용하는 간단하고 가벼운 타이머이며, 스레드 풀 스레드로 구동됩니다.
스레드 타이머는 메시지가 스레드에 전송되지 않는 상황에서 유용합니다.
사용 방법은 다음과 같습니다:
System.Threading.Timer threadTimer;
public void ThreadMethod(Object state)
{
//使用代理
string text = "자식 스레드 실행, thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = 새로운 SetTextCallback(SetText);
이거. Invoke(d, 새 객체[] { 텍스트 });
i++;
}
private void Form1_Load(object sender, EventArgs e)
{
threadTimer = new System.Threading.Timer(new System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
일시정지 코드:
threadTimer.Change(-1, -1);
이 실험의 효과는 서버 기반 타이머의 두 번째 방식(System.Timers.Timer)과 동일합니다.
물론 구체적인 사용 방법과 원칙은 다르지만, 가장 중요한 점은 이 방법이 이벤트 방법 대신 에이전트 방법을 사용하며, 폼과 컴포넌트에 의존하지 않고 별도로 실행할 수 있다는 점입니다
다음은 외국인들이 요약한 표(세 가지 방법의 차이)입니다:
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
타이머가 인스턴스화된 후 리스너를 추가하거나 제거하는 지원. 예 아니오 예
사용자 인터페이스 스레드에서 콜백 지원 예 아니오 예
스레드 풀에서 얻은 스레드에서 콜백 예 예 아니오
Windows Forms 디자이너에서 드래그 앤 드롭 기능을 지원합니다. 예, 아니오, 예
서버 멀티스레드 환경에서 실행하기에 적합하다 예 예 아니오
타이머 초기화에서 콜백으로 임의의 상태를 전달하는 지원도 포함합니다. 아니요, 네, 아니요
ID disposable을 구현합니다. 네, 네, 네.
일회성 콜백과 주기적인 반복 콜백 지원 예스
애플리케이션 도메인 경계를 넘어 접근 가능합니다 네 예
IComponent 지원 – 예 아니오 예스에서 호스팅 가능 |