Timers in C#

★━─….NET/C# 2010. 2. 19. 08:47
Timers in C#




Timer 클래스를 사용하려다 보니 Timer 클래스가 여러군데 정의되어 있는것을 확인하였다. 조금은 집고 넘어가야 할 것 같다.


.NET Timer Class

.NET Windowns 프로그래밍에서는 다음과 같은 3가지의 Timer 클래스를 제공한다.
각각 스레드 타이머, 서버 기반 타이머, Windowns 기반 타이머 라고도 한다.

System.Threading.Timer         
System.Timers.Timer              
System.Windows.Forms.Timer  







.NET 웹 프로그래밍에서는 다음 Timer 클래스를 사용한다.

System.Web.UI.Timer





System.Windows.Forms.Timer

Windows 기반 타이머 이다.
Windows Form 응용프로그램에서 사용할 수 있도록 최적화 되어 있으며 창에서 사용해야 한다. 이 타이머 는 UI 스레드를 사용하여 프로세스를 수행하는 단일 스레드 환경용이다. 이 타이머는 UI 스레드가 프로세싱을 수행하는 데 사용하는 단일 스레드 환경을 위해 설계되었다. 이 타이머를 사용하려면 사용자 코드에 사용 가능한 UI 메시지 펌프가 있어야 하고 항상 같은 스레드에서 수행되거나 다른 스레드로의 호출을 마샬링해야 한다. 이 기능은 COM 구성 요소의 성능을 저하시킨다.
정확성이 높은 다중 스레드 타이머가 필요하면 System.Timers 네임스페이스의 Timer 클래스를 사용해야 한다.
cf) Timer 클래스 - MSDN



System.Threading.Timer

스레드 타이머 이다.
이벤트 대신 콜백 메서드를 사용하고 스레드 풀 스레드를 사용하는 단순한 경량 타이머 이다. UI 스레드에서 콜백이 발생하지 않기 때문에 Windows Form 에서는 사용하지 않는 것이 좋다. Windows  Form 에서는 System.Windows.Forms.Timer 클래스를 사용하는것이 더 좋다. 서버 기반 타이머 기능의 경우 이벤트를 발생시키고 추가 기능을 제공하는 System.Timers.Timer 를 사용할 수 있다. TimerCallback 델리게이트를 사용하여 Timer 에서 실행 할 메서드를 지정한다. 타이머 델리게이트는 타이머가 생성될 때 지정되며 변경할 수 없다. 해당 메서드는 타이머를 만든 스레드에서 실행되지 않으며 시스템에서 제공하는 ThreadPool 스레드에서 실행된다. 스레드 타이머는 메시지가 스레드에서 펌프되지 않는 경우에 유용하다. 예를 들어, Windows 기반 타이머는 운영 체제의 타이머 지원 기능에 의존하며 스레드에서 메시지를 펌프하지 않을 경우에는 타이머 관련 이벤트가 발생하지 않는다. 이 경우에는 스레드 타이머가 보다 유용하다.
cf) Timer 클래스 - MSDN



System.Timers.Timer

서버 기반 타이머 이다. 일반 타이머를 서버 환경에서 최적으로 실행되도록 업데이트한 것이다. 서버 기반 타이머를 사용하면 응용프로그램에서 발생되는 이벤트의 반복 간격을 지정할 수 있다. 그런 다음 이 이벤트를 처리하여 정기적인 프로세싱을 제공할 수 있다. 서버 기반 타이머는 다중 스레드 환경에서 작업자 스레드와 함께 사용하도록 설계되었다. 두 스레드는 서로 다른 아키텍처를 사용하므로 서버 기반 타이머가 Windows 타이머보다 정확하다. 서버 타이머는 스레드 사이를 이동하면서 발생한 이벤트를 처리할 수 있다. 즉, 멀티스레드 환경에선 서버 기반 타이머를 사용하자.
cf) 서버 기반 타이미 소개 - MSDN



Server-Based Timer Demo

서버 기반 타이머 예제를 살펴보자. 실은 아래 블로그 포스트를 보다가 생각이 나서 이 내용들을 정리하게 되었다.
참조) Timers in C# - www.c-sharpconer
다시 한번!! 서버 기반 타이머는 간격을 지정하여 이벤트를 발생 시키며 해당 이벤트 핸들러에 특정 처리를 넣어 주면 된다.

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

public class Test
{
    public static void Main()
    {
        System.Timers.Timer myTimer = new System.Timers.Timer();
        myTimer.Elapsed += new ElapsedEventHandler(OnTimer);
        myTimer.Interval = 1000;
        myTimer.Enabled = true;
        myTimer.AutoReset = false;

        Console.WriteLine(@"Press 'q' and 'Enter' to quit...");

        while (Console.Read() != 'q')
        {
            Thread.Sleep(1000);
        }
    }

    public static void OnTimer(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("DateTime: " + DateTime.Now);
        System.Timers.Timer theTimer = (System.Timers.Timer)source;
        theTimer.Interval += 1000;
        theTimer.Enabled = true;
    }
}




코드와는 다르게 시간이 정확하지 않다. CPU 의 처리 우선순위 및 OS 의 멀티스레드 환경에 따라 이벤트 핸들러의 코드를 처리하기 때문에 정확하지는 않다.






Posted by six605
,