WaitHandle.WaitOne メソッド (Int32)

2013/12/12

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 以外の負数です。-1 は無制限のタイムアウトを表します。

millisecondsTimeout が 0 の場合、このメソッドではブロックが行われません。待機ハンドルの状態をテストして、すぐに制御を戻します。

このメソッドの呼び出し元は、現在のインスタンスがシグナルを受け取るか、タイムアウトになるまで、無期限にブロックします。WaitHandle が、非同期操作が完了したときに生成されるシグナルなどの、別のスレッドからのシグナルを受信するまで、このメソッドを使用してブロックします。詳細については、IAsyncResult インターフェイスのトピックを参照してください。

このメソッドをオーバーライドして、派生クラスの動作をカスタマイズします。

WaitOne(Int32) メソッドのオーバーロードを使用して、長時間待機しているスレッドが待機を中止して処理を実行できるようにする方法を、次の例に示します。

この例では、ThreadPool.QueueUserWorkItem メソッドを使用して、3 つのタスクをキューに配置します。各タスクが、共通の AutoResetEventWaitOne を呼び出します。このときに使用するタイムアウトは 3 秒です。待機がタイムアウトすると、タスクはメッセージを表示し、待機を再開します。条件に応じて待機を放棄するコードをここに追加することもできます。

この例では、MouseLeftButtonUp イベントが発生するたびに、待機中のスレッドを解放します。最後のスレッドが解放されると、イベント ハンドラーがアンフックされ、最終メッセージが表示されます。Interlocked.Increment メソッドおよび Interlocked.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

表示:
© 2014 Microsoft