반응형

C# System.Threading클래스의 사용법 2부

1부: thread 지정 + 상태확인

Timer Class: 일정 주기로 쓰레드를 실행하는 방법 정리.

예제

-. TimerCallback 델리게이트를 구현한 CheckStatus를 포함한 StatusChecker 클래스를 이용해서 메서드를 반복 실행하는 예제. AutoResetEvent 클래스를 이용한다.

class StatusChecker //StatusChecker Class 정의
{
    private int invokeCount;
    private int maxCount;

    public StatusChecker(int count)
    {
        invokeCount = 0;
        maxCount = count;
    }

    // timer delegate로 호출됨.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.",
            DateTime.Now.ToString("h:mm:ss.fff"),
            (++invokeCount).ToString());

        if (invokeCount == maxCount)
        {            
            invokeCount = 0;
            autoEvent.Set();
        }
    }
}
private void Btn_ThreadTimer_Click(object sender, RoutedEventArgs e)
{
    var autoEvent = new AutoResetEvent(false);
    
    var statusChecker = new StatusChecker(10);
    
    Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n", DateTime.Now);
    var stateTimer = new Timer(statusChecker.CheckStatus, autoEvent, 1000, 250);

    autoEvent.WaitOne();
    stateTimer.Change(0, 500);
    Console.WriteLine("\nChanging period to .5 seconds.\n");

    autoEvent.WaitOne();
    stateTimer.Dispose();
    Console.WriteLine("\nDestroying timer.");
}

----------출력----------

10:56:53.608 Creating timer.

10:56:54.613 Checking status  1.
10:56:54.864 Checking status  2.
10:56:55.115 Checking status  3.
10:56:55.366 Checking status  4.
10:56:55.617 Checking status  5.
10:56:55.868 Checking status  6.
10:56:56.118 Checking status  7.
10:56:56.369 Checking status  8.
10:56:56.620 Checking status  9.
10:56:56.871 Checking status 10.

Changing period to .5 seconds.

10:56:56.871 Checking status  1.
10:56:57.372 Checking status  2.
10:56:57.872 Checking status  3.
10:56:58.373 Checking status  4.
10:56:58.874 Checking status  5.
10:56:59.374 Checking status  6.
10:56:59.875 Checking status  7.
10:57:00.376 Checking status  8.
10:57:00.876 Checking status  9.
10:57:01.377 Checking status 10.

Destroying timer.

 

상세설명

StatusChecker class

-. 변수 정의

    private int invokeCount; // 매 스레드 진행회수 체크
    private int maxCount; // 스레드 반복회수. maxCount만큼 진행 후 스레드 정지

-. 클래스 생성 시 입력변수

    public StatusChecker(int count)
    {
        invokeCount = 0; // 처음 클래스 생성 시 0으로 설정
        maxCount = count; // 클래스 생성 시 전달받음. (이 예제에서는 10)
    }

-. Timer 델리게이트로 호출되는 메서드 CheckStatus

    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo; // AutoResetEvent 클래스 변수들 입력
        Console.WriteLine("{0} Checking status {1,2}.", DateTime.Now.ToString("h:mm:ss.fff"), (++invokeCount).ToString());

        if (invokeCount == maxCount)
        {            
            invokeCount = 0; // 카운터 리셋
            autoEvent.Set(); // 타이머에 신호 전달 (나 완료됐어요)
        }
    }

 

Timer 델리게이트 생성 및 호출

-. 클래스 선언

    var autoEvent = new AutoResetEvent(false); // 오토리셋이벤트 클래스 호출, false 입력 시 타이머 콜백 대기 (동기화)

    var statusChecker = new StatusChecker(10); // 10회 반복 설정

-. 타이머 생성

    var stateTimer = new Timer(statusChecker.CheckStatus, autoEvent, 1000, 250); // 타이머 델리게이트 선언 Timer(콜백, 오토리셋이벤트, 시작 전 대기시간, 주기);

-. 타이머 실행 대기 및 삭제

    autoEvent.WaitOne(); // 타이머에서 Set 실행 대기
    stateTimer.Dispose(); // 타이머 삭제

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기