RegisteredWaitHandle.Unregister(WaitHandle) メソッド

定義

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) メソッドによって発行された登録済みの待機操作を取り消します。

public:
 bool Unregister(System::Threading::WaitHandle ^ waitObject);
public bool Unregister(System.Threading.WaitHandle? waitObject);
public bool Unregister(System.Threading.WaitHandle waitObject);
[System.Runtime.InteropServices.ComVisible(true)]
public bool Unregister(System.Threading.WaitHandle waitObject);
member this.Unregister : System.Threading.WaitHandle -> bool
[<System.Runtime.InteropServices.ComVisible(true)>]
member this.Unregister : System.Threading.WaitHandle -> bool
Public Function Unregister (waitObject As WaitHandle) As Boolean

パラメーター

waitObject
WaitHandle

シグナル通知される WaitHandle

返品

true 関数が成功した場合。それ以外の場合は false

属性

次の例は、待機ハンドルが通知されたためにコールバックが発生した場合に、 Unregister メソッドを使用してタスクの登録を解除する方法を示しています。

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

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

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

メイン スレッドがAutoResetEvent メソッドを呼び出してSetに通知すると、WaitOrTimerCallback デリゲートが呼び出されます。 WaitProc メソッドは、タイムアウトが発生したかどうかを判断するためにRegisteredWaitHandleをテストします。 待機ハンドルが通知されたためにコールバックが呼び出された場合、 WaitProc メソッドは RegisteredWaitHandleの登録を解除し、追加のコールバックを停止します。 タイムアウトの場合、タスクは待機し続けます。 WaitProcメソッドは、コンソールにメッセージを出力することによって終了します。

using System;
using System.Threading;

// TaskInfo contains data that will be passed to the callback
// method.
public class TaskInfo {
    public RegisteredWaitHandle Handle = null;
    public string OtherInfo = "default";
}

public class Example {
    public static void Main(string[] args) {
        // The main thread uses AutoResetEvent to signal the
        // registered wait handle, which executes the callback
        // method.
        AutoResetEvent ev = new AutoResetEvent(false);

        TaskInfo ti = new TaskInfo();
        ti.OtherInfo = "First task";
        // The TaskInfo for the task includes the registered wait
        // handle returned by RegisterWaitForSingleObject.  This
        // allows the wait to be terminated when the object has
        // been signaled once (see WaitProc).
        ti.Handle = ThreadPool.RegisterWaitForSingleObject(
            ev,
            new WaitOrTimerCallback(WaitProc),
            ti,
            1000,
            false
        );

        // The main thread waits three seconds, to demonstrate the
        // time-outs on the queued thread, and then signals.
        Thread.Sleep(3100);
        Console.WriteLine("Main thread signals.");
        ev.Set();

        // The main thread sleeps, which should give the callback
        // method time to execute.  If you comment out this line, the
        // program usually ends before the ThreadPool thread can execute.
        Thread.Sleep(1000);
        // If you start a thread yourself, you can wait for it to end
        // by calling Thread.Join.  This option is not available with 
        // thread pool threads.
    }
   
    // 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) {
        // The state object must be cast to the correct type, because the
        // signature of the WaitOrTimerCallback delegate specifies type
        // Object.
        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.
            if (ti.Handle != null)
                ti.Handle.Unregister(null);
        } 

        Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.",
            ti.OtherInfo, 
            Thread.CurrentThread.GetHashCode().ToString(), 
            cause
        );
    }
}
Imports System.Threading

' TaskInfo contains data that will be passed to the callback
' method.
Public Class TaskInfo
    public Handle As RegisteredWaitHandle = Nothing
    public OtherInfo As String = "default"
End Class

Public Class Example

    <MTAThread> _
    Public Shared Sub Main()
        ' The main thread uses AutoResetEvent to signal the
        ' registered wait handle, which executes the callback
        ' method.
        Dim ev As New AutoResetEvent(false)

        Dim ti As New TaskInfo()
        ti.OtherInfo = "First task"
        ' The TaskInfo for the task includes the registered wait
        ' handle returned by RegisterWaitForSingleObject.  This
        ' allows the wait to be terminated when the object has
        ' been signaled once (see WaitProc).
        ti.Handle = ThreadPool.RegisterWaitForSingleObject( _
            ev, _
            New WaitOrTimerCallback(AddressOf WaitProc), _
            ti, _
            1000, _
            false _
        )

        ' The main thread waits about three seconds, to demonstrate 
        ' the time-outs on the queued task, and then signals.
        Thread.Sleep(3100)
        Console.WriteLine("Main thread signals.")
        ev.Set()

        ' The main thread sleeps, which should give the callback
        ' method time to execute.  If you comment out this line, the
        ' program usually ends before the ThreadPool thread can execute.
        Thread.Sleep(1000)
        ' If you start a thread yourself, you can wait for it to end
        ' by calling Thread.Join.  This option is not available with 
        ' thread pool threads.
    End Sub
   
    ' 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 Shared Sub WaitProc(state As Object, timedOut As Boolean)
        ' The state object must be cast to the correct type, because the
        ' signature of the WaitOrTimerCallback delegate specifies type
        ' Object.
        Dim ti As TaskInfo = CType(state, TaskInfo)

        Dim cause As String = "TIMED OUT"
        If Not timedOut Then
            cause = "SIGNALED"
            ' If the callback method executes because the WaitHandle is
            ' signaled, stop future execution of the callback method
            ' by unregistering the WaitHandle.
            If Not ti.Handle Is Nothing Then
                ti.Handle.Unregister(Nothing)
            End If
        End If 

        Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.", _
            ti.OtherInfo, _
            Thread.CurrentThread.GetHashCode().ToString(), _
            cause _
        )
    End Sub
End Class

注釈

waitObjectを指定すると、RegisteredWaitHandleが正常に登録解除された場合にのみ通知されます。 Unregisterの実行時にコールバック メソッドが進行中の場合、コールバック メソッドが完了するまでwaitObjectは通知されません。 特に、コールバック メソッドが Unregister実行される場合、そのコールバック メソッドが完了するまで、 waitObject は通知されません。

適用対象

こちらもご覧ください