次の方法で共有


WaitOrTimerCallback デリゲート

WaitHandle がシグナル通知されたとき、またはタイムアウトしたときに呼び出されるメソッドを表します。

<Serializable>
Public Delegate Sub WaitOrTimerCallback( _   ByVal state As Object, _   ByVal timedOut As Boolean _)
[C#]
[Serializable]
public delegate void WaitOrTimerCallback(   object state,   bool timedOut);
[C++]
[Serializable]
public __gc __delegate void WaitOrTimerCallback(   Object* state,   bool timedOut);

[JScript] JScript では、.NET Framework のデリゲートを利用することができます。ただし、独自に定義することはできません。

パラメータ [Visual Basic, C#, C++]

コールバック メソッドの宣言のパラメータは、WaitOrTimerCallback デリゲートの宣言と同じでなければなりません。

  • state
    コールバック メソッドが実行されるたびに使用する情報を格納したオブジェクト。
  • timedOut
    WaitHandle がタイムアウトした場合は true 。シグナル通知された場合は false

解説

WaitOrTimerCallback は、登録済み待機ハンドルがタイムアウトしたかシグナル通知されたときに実行するコールバック メソッドを表します。デリゲートを作成するには、 WaitOrTimerCallback コンストラクタにコールバック メソッドを渡します。メソッドには、ここに示すシグネチャを付ける必要があります。

登録済み待機ハンドルを作成するには、 WaitOrTimerCallback デリゲートと WaitHandleThreadPool.RegisterWaitForSingleObject に渡します。コールバック メソッドは、 WaitHandle がタイムアウトするか、シグナル通知されるたびに実行されます。

[Visual Basic] メモ   Visual Basic のユーザーは WaitOrTimerCallback コンストラクタを省略できます。コールバック メソッドを RegisterWaitForSingleObject に渡すときは単純に AddressOf 演算子を使用できます。Visual Basic は正しいデリゲート コンストラクタを自動的に呼び出します。

コールバック メソッドに情報を渡す場合は、必要な情報を格納したオブジェクトを作成し、登録済み待機ハンドルを作成するときにこのオブジェクトを RegisterWaitForSingleObject に渡します。コールバック メソッドが実行されるたびに、 state パラメータはこのオブジェクトを保持します。

コールバック メソッドを使用してスレッド プール スレッドを同期する方法の詳細については、「 スレッド プーリング 」を参照してください。

使用例

 
Imports System
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
    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

[C#] 
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
        );
    }
}

[C++] 
#using <mscorlib.dll>

using namespace System;
using namespace System::Threading;

// TaskInfo contains data that will be passed to the callback
// method.
public __gc class TaskInfo 
{
public:
    TaskInfo()
    {
        Handle = 0;
        OtherInfo = S"default";
    }

    RegisteredWaitHandle* Handle;;
    String* OtherInfo;
};


__gc class Example
{
    // 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 = static_cast<TaskInfo*>(state);

        String* cause = S"TIMED OUT";
        if (!timedOut) {
            cause = S"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 != 0)
                ti->Handle->Unregister(0);
        } 

        Console::WriteLine(S"WaitProc( {0}) executes on thread {1}; cause = {2}.",
            ti->OtherInfo, __box(Thread::CurrentThread->GetHashCode()), cause);
    }
};

int main() 
{
    // 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 = S"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(0, Example::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(S"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.
    return 0;
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Threading

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

System.Threading 名前空間 | スレッドおよびスレッド処理 | スレッド プーリング