Laboratory/Develop

시간 간격을 둔 메서드 호출

theking 2008. 3. 7. 22:20

시간 간격을 둔 메서드 호출

? Calling a Method at Timed Intervals

 

이번에는 시간 간격을 가진 메서드 호출에 관한 내용입니다.프로젝트를 진행하다 보면 특정 작업을 특정 시간에 처리해야 하는 일들을 개발해야 할 일들이 있을 것입니다.

생각해 보니까,국내의 유명 개발 커뮤니티(Devxxx)의 질문&답변 게시판에서도 이런 질문들을 자주 본 것 같습니다.

이런 것이 아니더라도 일정 시간 간격을 두고 메서드를 호출하는 방법도 자주 발생 할 수도 있겠네요.이런 경우에도 역시 우리가 이야기 하고 있는ThreadPool은 이러한 작업들을 처리하는 방법을 완벽히 지원한다고 합니다.(perfect thing for you to use.)

바로System.Threading네임스페이스밑에있는Timer클래스인데여러분이위에서이야기작업들을처리하기위해서Timer클래스의인스턴스를생성했다면여러분은ThreadPool에게앞으로지정된시간에메서드를실행시키고싶다고이야기하는것과같습니다.

Timer클래스의생성자는아래와같습니다.

 

Timer (TimerCallback)

 

Timer (TimerCallback, Object, Int32, Int32)

 

Timer (TimerCallback, Object, Int64, Int64)

 

Timer (TimerCallback, Object, TimeSpan, TimeSpan)

 

Timer (TimerCallback, Object, UInt32, UInt32)

 

생성자의 파라미터를 보면 이전“ThreadPool을 이용한 비동기 메서드 호출에서 봤던 것과 비슷한2개의 파라미터가 보입니다.

바로TimerCallbackobject형의 파라미터 인데 이TimerCallback파라미터 역시delegate형 파라미터로써 앞의 글에서 이야기한WaitCallback파라미터와 이름만 다를 뿐,동일한 기능을 수행하며obect파라미터 또한 앞의 글에서 이야기한 파라미터와 동일합니다.

 

그런데 이 두 개를 제외하고도 나머지 파라미터가 보입니다.이 중 첫 번째 파라미터는TimerCallback delegate를 이용해 지정한 메서드가 처음 시작 될 때 얼마 동안 대기했다가 실행할 것인지를 구분하는millisecond값입니다.그리고 그 다음에 할당되는 파라미터는 메서드 호출 사이에 대기하는 기간(period)을 나타내는 값을 가집니다.

만약 이 값에0을 할당한 경우에는ThreadPool은 메서드 실행 중간에 대기 시간을 가지지 않고 연속해서 모든 메서드를 실행시켜 버립니다.

또한 TimerCallback파라미터만 가지는 생성자는 시작 시 대기시간 또는 메서드 처리 중간의 대기시간을 지정하지 않았기 때문에,무한 기간 및 무한 만료 시간을 갖는Timer개체를 생성합니다.

 

Timer클래스를 이용해서 메서드를 실행 하게 되면ThreadPool은 무엇을 해야 할지를 알아 차리고 실행 과정을 자동으로 모니터링 합니다.또한Timer클래스는 몇 개의 추가적인 메서드를 통해 개발자가ThreadPoolTimer클래스의 지정된 시간을 변경 하거나 실행을 취소 할 수 있는 기능을 제공합니다.

아래는 위에서 이야기 한 기능을 수행할 수 있게Timer클래스가 제공하는 메서드 들입니다.

 

Timer.Change (Int32, Int32)

Timer.Change (Int64, Int64)

Timer.Change (TimeSpan, TimeSpan)

Timer.Change (UInt32, UInt32)

 

Timer.Dispose ()

Timer.Dispose (WaitHandle)

 

*위 메서드들은 정적(static)메서드가 아닌 인스턴스 메서드 입니다.

 

Dispose메서드를 호출하면Timer클래스에서 사용중인 모든 리소스를 해지하고 다시 사용할 수 있는 상태로 바뀌기 때문에,실행할 메서드를 중지 시킬 수 있습니다.이 메서드의 파라미터 중에waitHandleTimer클래스에서 사용하는 모든 리소스를 해제한 후, Timer클래스가 삭제되면waitHandle에 연결된Handler에게 모든 리소스가 해제 되었다는 신호를 보내는 역할을 합니다.

그럼 이Timer클래스에서 생성자에 할당되는 파라미터 중,메서드 실행 대기시간을 설정하는 값을 이용한 테스트 코드를 보도록 하겠습니다.

 

usingSystem.Threading;

 

namespaceThreadPoolTest

{

   classProgram

   {

       staticvoidMain(string[] args)

       {

           Console.WriteLine("Checking for status updates every 2 seconds.");

           Console.WriteLine("  (Hit Enter to terminate the sample)");

           Timertimer =newTimer(newTimerCallback(CheckStatus),null, 0, 2000);

 

           Console.ReadLine();

       }

 

       staticvoidCheckStatus(Objectstate)

       {

           Console.WriteLine("Checking Status.");

           // ...

       }

   }

}

 

이 코드를 실행하게 되면Timer클래스가 실행하는CheckStatus메서드는2(2000 millisecond)간격을 두고 반복해서 실행하게 됩니다.

 

이것으로Jeffery Richter가 설명하는ThreadPool의 메서드 실행 두 번째 방법에 대해서 알아봤습니다.이제 하나가 더 남은 것 같습니다.남은 하나도 그리 길지 않게 마저 소개하도록 하겠습니다.감사합니다. ^o^v

 

*이 글의 원문은 아래 주소와 같습니다.

http://msdn.microsoft.com/msdnmag/issues/03/06/NET/

 

 

Posted by zmeun

http://zmeun.tistory.com

--------------
Back to Top