RegisteredWaitHandle.Unregister(WaitHandle) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
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 되는 은 콜백 메서드가 에 액세스할 수 RegisteredWaitHandle있도록 개체의 TaskInfo
필드에 할당됩니다Handle
.
를 콜백 메서드에 전달할 개체로 지정하는 TaskInfo
것 외에도 메서드에 RegisterWaitForSingleObject 대한 호출은 태스크가 대기할, 콜백 메서드를 WaitOrTimerCallback 나타내는 WaitProc
대리자, 1초 시간 제한 간격 및 여러 콜백을 지정 AutoResetEvent 합니다.
주 스레드는 해당 Set 메서드를 호출하여 에 AutoResetEvent 신호를 보내면 대리자를 WaitOrTimerCallback 호출합니다. 메서드는 WaitProc
RegisteredWaitHandle 시간 초과가 발생했는지 여부를 확인하기 위해 테스트합니다. 대기 핸들이 신호를 받았기 때문에 콜백이 호출된 경우 메서드는 WaitProc
를 등록 취소하고 RegisteredWaitHandle추가 콜백을 중지합니다. 시간 초과의 경우 작업은 계속 대기합니다. 메서드는 WaitProc
콘솔에 메시지를 인쇄하여 끝납니다.
using namespace System;
using namespace System::Threading;
// TaskInfo contains data that will be passed to the callback
// method.
public ref class TaskInfo
{
public:
TaskInfo()
{
Handle = nullptr;
OtherInfo = "default";
}
RegisteredWaitHandle^ Handle;
String^ OtherInfo;
};
ref class Example
{
public:
// 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.
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 = "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 != nullptr )
ti->Handle->Unregister( nullptr );
}
Console::WriteLine( "WaitProc( {0}) executes on thread {1}; cause = {2}.", ti->OtherInfo, Thread::CurrentThread->GetHashCode(), cause );
}
};
int main()
{
// The main thread uses AutoResetEvent to signal the
// registered wait handle, which executes the callback
// method.
AutoResetEvent^ ev = gcnew AutoResetEvent( false );
TaskInfo^ ti = gcnew 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, gcnew WaitOrTimerCallback( 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( "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;
}
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 신호를 보냅니다. 실행할 waitObject
때 Unregister 콜백 메서드가 진행 중인 경우 콜백 메서드가 완료될 때까지 신호를 받지 않습니다. 특히 콜백 메서드가 를 실행하는 UnregisterwaitObject
경우 해당 콜백 메서드가 완료될 때까지 신호가 표시되지 않습니다.
적용 대상
추가 정보
.NET