■ ThreadPool 클래스의 RegisterWaitForSingleObject 메소드를 사용해 타임아웃을 사용하는 방법을 보여준다.
▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
using System; using System.Threading; ... #region 대기 또는 타이머 콜백 처리하기 - WaitOrTimerCallback(cancellationTokenSource, isTimedOut) /// <summary> /// 대기 또는 타이머 콜백 처리하기 /// </summary> /// <param name="cancellationTokenSource">취소 토큰 소스</param> /// <param name="isTimedOut">타임아웃 여부</param> private void WaitOrTimerCallback(CancellationTokenSource cancellationTokenSource, bool isTimedOut) { if(isTimedOut) { cancellationTokenSource.Cancel(); Console.WriteLine("타임아웃으로 테스트 처리가 취소되었습니다."); } else { Console.WriteLine("테스트가 완료되었습니다."); } } #endregion #region 테스트 처리하기 - Test(cancellationToken, manualResetEvent) /// <summary> /// 테스트 처리하기 /// </summary> /// <param name="cancellationToken">취소 토큰</param> /// <param name="manualResetEvent">수동 리셋 이벤트</param> private void Test(CancellationToken cancellationToken, ManualResetEvent manualResetEvent) { for(int i = 0; i < 6; i++) { if(cancellationToken.IsCancellationRequested) { return; } Thread.Sleep(TimeSpan.FromSeconds(1)); } manualResetEvent.Set(); } #endregion #region 테스트 실행하기 - ExecuteTest(timeoutTimeSpan) /// <summary> /// 테스트 실행하기 /// </summary> /// <param name="timeoutTimeSpan">타임아웃 시간</param> private void ExecuteTest(TimeSpan timeoutTimeSpan) { using(ManualResetEvent manualResetEvent = new ManualResetEvent(false)) { using(CancellationTokenSource cancellationTokenSource = new CancellationTokenSource()) { Console.WriteLine("타임아웃 작업을 등록합니다..."); RegisteredWaitHandle registeredWaitHandle = ThreadPool.RegisterWaitForSingleObject ( manualResetEvent, (state, isTimedOut) => WaitOrTimerCallback(cancellationTokenSource, isTimedOut), null, timeoutTimeSpan, true ); Console.WriteLine("긴 실행 작업을 시작합니다..."); ThreadPool.QueueUserWorkItem(_ => Test(cancellationTokenSource.Token, manualResetEvent)); Thread.Sleep(timeoutTimeSpan.Add(TimeSpan.FromSeconds(2))); registeredWaitHandle.Unregister(manualResetEvent); } } } #endregion ... ExecuteTest(TimeSpan.FromSeconds(5)); ExecuteTest(TimeSpan.FromSeconds(7)); |