인터벌을 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();