내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

WaitHandle.WaitOne 메서드 (Int32)

2013-12-13

부호 있는 32비트 정수를 사용하여 시간 간격을 지정하고 현재 WaitHandle이 신호를 받을 때까지 현재 스레드를 차단합니다.

Namespace:  System.Threading
어셈블리:  mscorlib(mscorlib.dll)

public virtual bool WaitOne(
	int millisecondsTimeout
)

매개 변수

millisecondsTimeout
형식: System.Int32
대기할 시간(밀리초)이거나, 무기한 대기할 경우 Timeout.Infinite(-1)입니다.

반환 값

형식: System.Boolean
현재 인스턴스가 신호를 받으면 true이고, 그렇지 않으면 false입니다.

예외조건
ObjectDisposedException

현재 인스턴스가 이미 삭제된 경우

ArgumentOutOfRangeException

millisecondsTimeout이 무기한 시간 제한을 나타내는 -1 이외의 음수인 경우

millisecondsTimeout이 0이면 메서드가 차단하지 않습니다. 대신 대기 핸들의 상태를 테스트한 다음 즉시 반환합니다.

이 메서드의 호출자는 현재 인스턴스가 신호를 받거나 제한 시간이 초과될 때까지 차단합니다. WaitHandle이 다른 스레드에서 신호(예: 비동기 작업이 완료되었을 때 생성되는 신호)를 받을 때까지 이 메서드를 사용하여 차단하세요. 자세한 내용은 IAsyncResult 인터페이스를 참조하세요.

파생 클래스의 동작을 사용자 지정하려면 이 메서드를 재정의합니다.

다음 예제에서는 WaitOne(Int32) 메서드 오버로드를 사용하여 대기 스레드가 긴 대기 상태에서 나와 다른 처리를 수행하도록 하는 방법을 보여 줍니다.

이 예제에서는 ThreadPool.QueueUserWorkItem 메서드를 사용하여 세 작업을 큐에 추가합니다. 각 작업은 3초의 제한 시간을 사용하여 공통 AutoResetEvent 이벤트에서 WaitOne을 호출합니다. 대기 제한 시간이 초과하면 작업은 메시지를 표시하고 계속 대기합니다. 조건에 따라 대기를 중단하는 코드를 여기에 추가할 수 있습니다.

이 예제에서는 MouseLeftButtonUp 이벤트가 발생할 때마다 대기 스레드를 해제합니다. 마지막 스레드가 해제되면 이벤트 처리기를 언후크하고 최종 메시지를 표시합니다. Interlocked.IncrementInterlocked.Decrement 메서드는 카운트에 대한 동시 액세스를 방지하는 데 사용됩니다.

이 예제에서는 Dispatcher.BeginInvoke 메서드에 의해 사용자 인터페이스 스레드에서 실행되는 도우미 메서드를 사용하여 ThreadPool 스레드에서 사용자 인터페이스 요소에 안전하게 액세스합니다.

참고참고:

이 예제를 실행하려면 Windows Phone용 정적 TextBlock 컨트롤이 있는 예제 빌드를 참조하세요.


using System;
using System.Threading;

// The following imports simplify the supporting code; they are not required for 
// WaitHandle:
using System.Windows.Controls;
using System.Windows.Input;

public class Example
{
   private static System.Windows.Controls.TextBlock outputBlock;
   private static AutoResetEvent autoEvent = new AutoResetEvent(false);
   private static int threadCount = 0;

   public static void Demo(TextBlock outputBlock)
   {
      Example.outputBlock = outputBlock;

      for(int i = 1; i <= 3; i++)
      {
         Interlocked.Increment(ref threadCount);
         ThreadPool.QueueUserWorkItem(WorkMethod, i);
      }

      outputBlock.MouseLeftButtonUp += MouseUp;
   }

   private static void WorkMethod(object stateInfo)
   {
      int number = (int) stateInfo;
      outputBlock.Dispatcher.BeginInvoke(displayHelper, 
            String.Format("Task {0} is queued. Click to release.\n", number));

      DateTime start = DateTime.Now;
      while (!autoEvent.WaitOne(3000))
      {
         outputBlock.Dispatcher.BeginInvoke(displayHelper, 
            String.Format("Task {0} has waited {1} seconds. Click to release.\n", 
                          number, 
                          (DateTime.Now-start).TotalMilliseconds));
      }

      outputBlock.Dispatcher.BeginInvoke(displayHelper, 
                     String.Format("Task {0} is ending.\n", number));

      if (Interlocked.Decrement(ref threadCount) == 0)
      {
         // Disable the mouse.
         outputBlock.Dispatcher.BeginInvoke(delegate () {
                                   outputBlock.MouseLeftButtonUp -= MouseUp; });

         outputBlock.Dispatcher.BeginInvoke(displayHelper, 
                         "Refresh the page to run the demo again.\n");               
      }
   }

   private static void MouseUp(object sender, MouseButtonEventArgs e)
   {
      // Release a thread.
      autoEvent.Set();
   }

   // Helper methods:

   // In order to update the TextBlock object, which is on the UI thread, you must
   // make a cross-thread call by using the Dispatcher object that is associated 
   // with the TextBlock. The DisplayOutput helper method and its delegate, 
   // displayHelper, are used by the BeginInvoke method of the Dispatcher object
   // to append text to the TextBlock. 
   //
   private static Action<string> displayHelper = new Action<string>(DisplayOutput);
   private static void DisplayOutput(string msg)
   {
      outputBlock.Text += msg;
   }
}

/* This example produces output similar to the following:

Task 1 is queued. Click to release.
Task 2 is queued. Click to release.
Task 3 is queued. Click to release.
Task 2 has waited 3010.7421 seconds. Click to release.
Task 1 has waited 3026.3418 seconds. Click to release.
Task 3 has waited 3010.7421 seconds. Click to release.
Task 3 is ending.
Task 1 has waited 6037.0839 seconds. Click to release.
Task 2 has waited 6021.4842 seconds. Click to release.
Task 2 is ending.
Task 1 is ending.
Refresh the page to run the demo again.
 */


Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

표시:
© 2015 Microsoft