윈도우에서 기본으로 제공하는 타이머보다 좋은 점은
인터벌을 1로 주어도 메인폼과는 별도의 쓰레드로 구현되기 때문에 이벤트가 실행되는데 무리가 없음




2012/01/09 - [프로그램 자료/Visual C#] - 델리게이트 delegate 쓰는 방법! 크로스 쓰레드ㅠㅠ



 

class ThreadTimer : IDisposable

{

    private bool _status = false;

    private System.Threading.Timer ScadularTimer;

    private int _interval = 1000;

    public int Interval

    {

        get { return this._interval; }

        set

        {

            this._interval = value;

            if (_status) ScadularTimer.Change(0, _interval);

        }

    }

    public Action TimerEvent { get; set; }

    public ThreadTimer()

    {

        ScadularTimer = new System.Threading.Timer(TimerCallBack);

    }

    public void Stop()

    {

        if (ScadularTimer != null)

        {

            ScadularTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);

            _status = false;

        }

    }

    public void Start()

    {

        ScadularTimer.Change(0, _interval);

        _status = true;

    }

    private void TimerCallBack(object state)

    {

        Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));

        TimerEvent();

    }

 

    #region IDisposable Support

    private bool disposedValue = false; // 중복 호출을 검색하려면

 

    protected virtual void Dispose(bool disposing)

    {

        if (!disposedValue)

        {

            if (disposing)

            {

                // TODO: 관리되는 상태(관리되는 개체)를 삭제합니다.

                ScadularTimer.Dispose();

            }

 

            // TODO: 관리되지 않는 리소스(관리되지 않는 개체)를 해제하고 아래의 종료자를 재정의합니다.

            // TODO: 큰 필드를 null로 설정합니다.

 

            disposedValue = true;

        }

    }

 

    // TODO: 위의 Dispose(bool disposing)에 관리되지 않는 리소스를 해제하는 코드가 포함되어 있는 경우에만 종료자를 재정의합니다.

    // ~ThreadTimer() {

    //   // 이 코드를 변경하지 마세요. 위의 Dispose(bool disposing)에 정리 코드를 입력하세요.

    //   Dispose(false);

    // }

 

    // 삭제 가능한 패턴을 올바르게 구현하기 위해 추가된 코드입니다.

    public void Dispose()

    {

        // 이 코드를 변경하지 마세요. 위의 Dispose(bool disposing)에 정리 코드를 입력하세요.

        Dispose(true);

        // TODO: 위의 종료자가 재정의된 경우 다음 코드 줄의 주석 처리를 제거합니다.

        // GC.SuppressFinalize(this);

    }

    #endregion

}

 

 

 

 

사용법

ThreadTimer t = new ThreadTimer();

t.Interval = 1000;

t.TimerEvent = delegate () { Console.WriteLine("Action!"); };

t.Start();

 

 

타이머 정지

t.Stop();








Posted by motolies
,