エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

ThreadPool.RegisterWaitForSingleObject メソッド (WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

2013/12/12

ミリ秒単位のタイムアウトとして 32 ビット符号なし整数を指定して、WaitHandle を待機するデリゲートを登録します。

この API は、CLS に準拠していません。 

Namespace:  System.Threading
アセンブリ:  mscorlib (mscorlib.dll 内)

[CLSCompliantAttribute(false)]
public static RegisteredWaitHandle RegisterWaitForSingleObject(
	WaitHandle waitObject,
	WaitOrTimerCallback callBack,
	Object state,
	uint millisecondsTimeOutInterval,
	bool executeOnlyOnce
)

パラメーター

waitObject
型: System.Threading.WaitHandle
登録する待機ハンドル。
callBack
型: System.Threading.WaitOrTimerCallback
waitObject パラメーターが通知されたときに呼び出すデリゲート。
state
型: System.Object
代行に渡されたオブジェクト。
millisecondsTimeOutInterval
型: System.UInt32
ミリ秒単位のタイムアウト。millisecondsTimeOutInterval パラメーターが 0 (ゼロ) の場合、この関数はオブジェクトの状態をテストし、直ちに値を返します。millisecondsTimeOutInterval が -1 の場合、関数のタイムアウト間隔が経過することはありません。
executeOnlyOnce
型: System.Boolean
デリゲートの呼び出し後、スレッドが waitObject パラメーターを待機しなくなる場合は true。待機が登録解除されるまでは、待機操作が完了するたびにタイマーをリセットする場合は false

戻り値

型: System.Threading.RegisteredWaitHandle
登録された待機ハンドル。

例外条件
ArgumentOutOfRangeException

millisecondsTimeOutInterval パラメーターが -1 未満です。

このメソッドによって返される RegisteredWaitHandle を使い終わったら、その RegisteredWaitHandle.Unregister メソッドを呼び出して待機ハンドルへの参照を解放します。executeOnlyOncetrue を指定したとしても、RegisteredWaitHandle.Unregister メソッドは常に呼び出すことをお勧めします。登録された待機ハンドルのファイナライザーに依存するのではなく、RegisteredWaitHandle.Unregister メソッドを呼び出すことで、ガベージ コレクションはより効率的に動作します。

RegisterWaitForSingleObject メソッドは、指定したデリゲートをスレッド プールのキューに置きます。次のいずれかが発生すると、ワーカー スレッドはデリゲートを実行します。

  • 指定したオブジェクトがシグナル状態です。

  • タイムアウト間隔が経過します。

RegisterWaitForSingleObject メソッドは、指定したオブジェクトの WaitHandle の現在の状態をチェックします。オブジェクトの状態が非シグナル状態である場合、このメソッドは待機操作を登録します。待機操作は、スレッド プールのスレッドによって実行されます。オブジェクトの状態がシグナル状態になると、またはタイムアウト間隔が経過すると、デリゲートがワーカー スレッドによって実行されます。timeOutInterval パラメーターが 0 (ゼロ) 以外で、executeOnlyOnce パラメーターが false である場合は、イベントがシグナル状態になるたびに、またはタイムアウト間隔が経過するたびにタイマーがリセットされます。

待機操作をキャンセルするには、RegisteredWaitHandle.Unregister メソッドを呼び出します。

このメソッドは、戻る前に、同期オブジェクトのいくつかの型の状態を変更します。変更は、シグナル状態によって待機条件が満たされたオブジェクトに対してだけ発生します。

バージョンについてのメモ

Windows Phone

ユーザーが Windows Phone アプリケーションから進む場合、アプリケーションは通常、休止状態になります。ユーザーが休止状態に戻ると、アプリケーションは自動的に再開されます。この API が使用されている間にアプリケーションが休止状態になった場合、API は意図したとおりには完了しません。アプリケーションは、この可能性に対処するように設定されている必要があります。Windows Phone 実行モデルの詳細については、「Windows Phone の実行モデル」を参照してください。

RegisterWaitForSingleObject メソッドを使用して、指定の待機ハンドルがシグナル通知を受けたときに、指定のコールバック メソッドを実行する方法を次の例に示します。この例では、コールバック メソッドは WaitProc、待機ハンドルは AutoResetEvent です。

この例では、実行時にコールバックに渡す情報を保持する TaskInfo クラスを定義しています。この例では、TaskInfo オブジェクトを作成し、そのオブジェクトに文字列データを割り当てます。RegisterWaitForSingleObject メソッドから返された RegisteredWaitHandle は、TaskInfo オブジェクトの Handle フィールドに割り当てます。こうすることで、コールバック メソッドが RegisteredWaitHandle にアクセスできます。

RegisterWaitForSingleObject メソッドの呼び出しでは、コールバック メソッドに渡すオブジェクトとして TaskInfo を指定するのに加え、タスクが待機する AutoResetEventWaitProc コールバック メソッドを表す WaitOrTimerCallback デリゲート、1 秒のタイムアウト間隔、および複数コールバックを指定します。

メイン スレッドが AutoResetEventSet メソッドを呼び出してシグナル通知すると、WaitOrTimerCallback デリゲートが呼び出されます。WaitProc メソッドは RegisteredWaitHandle を調べ、タイムアウトが発生したかどうかを判断します。待機ハンドルがシグナル通知されたことによってコールバックが呼び出された場合は、WaitProc メソッドは RegisteredWaitHandle の登録を解除して、それ以降のコールバックを停止します。タイムアウトの場合は、タスクは引き続き待機します。WaitProc メソッドは、メッセージを表示して終了します。

出力は、UI スレッドの TextBlock に表示されます。コールバック スレッドから TextBlock にアクセスするために、Dispatcher プロパティを使用して TextBlock 用の Dispatcher オブジェクトを取得した後、Dispatcher.BeginInvoke メソッドを使用してスレッド間呼び出しを実行しています。

メモメモ:

この例を実行するには、「Windows Phone での静的 TextBlock コントロールのあるコード例のビルド」を参照してください。


using System;
using System.Threading;

// TaskInfo contains data that will be passed to the callback 
// method.
public class TaskInfo
{
   public RegisteredWaitHandle Handle = null;
   public System.Windows.Controls.TextBlock OutputBlock = null;
}

public class Example
{
    // The Demo method runs the example. It sets up an event handler to 
    // signal the wait handle, saves the TextBlock that is  used for 
    // output, and finally registers the wait handle.
    public static void Demo(System.Windows.Controls.TextBlock outputBlock)
    {
        outputBlock.Text = "Click here signal the wait handle.\r\n";

        // Create the wait handle that the example waits on.
        AutoResetEvent ev = new AutoResetEvent(false);

        // Set up an event handler to signal the wait handle when the 
        // TextBlock is clicked.
        outputBlock.MouseLeftButtonUp += (object sender, 
            System.Windows.Input.MouseButtonEventArgs e) => ev.Set();

        // Create a TaskInfo and save the TextBlock that the example uses
        // for output.
        TaskInfo ti = new TaskInfo();
        ti.OutputBlock = outputBlock;

        // Set the Handle property of the TaskInfo to the registered wait
        // handle that is returned by RegisterWaitForSingleObject. This 
        // enables the wait to be terminated when the handle has been 
        // signaled once (see WaitProc).
        ti.Handle = ThreadPool.RegisterWaitForSingleObject(
            ev,
            new WaitOrTimerCallback(WaitProc),
            ti,
            1000,
            false
        );
    }

    // The callback method executes when the registered wait times out,
    // or when the WaitHandle (in this case AutoResetEvent) is signaled.
    // WaitProc unregisters the WaitHandle the first time the event is 
    // signaled.
    public static void WaitProc(object state, bool timedOut)
    {
        TaskInfo ti = (TaskInfo)state;

        string cause = "TIMED OUT";
        if (!timedOut)
        {
            cause = "SIGNALED";
            // If the callback method executes because the WaitHandle is
            // signaled, stop future execution of the callback method
            // by unregistering the WaitHandle.
            ti.Handle.Unregister(null);
        }

        ti.OutputBlock.Dispatcher.BeginInvoke(delegate () {
            ti.OutputBlock.Text += 
                String.Format("WaitProc is running; cause = {0}.\n", cause);
        });
    }
}

/* This example produces output similar to the following:

Click here to signal the wait handle.
WaitProc is running; cause = TIMED OUT.
WaitProc is running; cause = TIMED OUT.
WaitProc is running; cause = TIMED OUT.
WaitProc is running; cause = SIGNALED.
 */


Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示:
© 2015 Microsoft