ThreadPool.RegisterWaitForSingleObject Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Regisztrál egy meghatalmazottat, aki egy .WaitHandle
Túlterhelések
| Name | Description |
|---|---|
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle32 bites aláíratlan egész számot az időkorláthoz ezredmásodpercben. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Regisztrál egy meghatalmazottat, aki megvár egy WaitHandleidőtúllépési értéket megadva TimeSpan . |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle32 bites aláírt egész számot az időtúllépéshez ezredmásodpercben. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle64 bites aláírt egész számot az időtúllépéshez ezredmásodpercben. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
Fontos
Ez az API nem CLS-kompatibilis.
Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle32 bites aláíratlan egész számot az időkorláthoz ezredmásodpercben.
public:
static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::Object ^ state, System::UInt32 millisecondsTimeOutInterval, bool executeOnlyOnce);
[System.CLSCompliant(false)]
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, uint millisecondsTimeOutInterval, bool executeOnlyOnce);
[System.CLSCompliant(false)]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce);
[System.CLSCompliant(false)]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, uint millisecondsTimeOutInterval, bool executeOnlyOnce);
[<System.CLSCompliant(false)>]
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * uint32 * bool -> System.Threading.RegisteredWaitHandle
[<System.CLSCompliant(false)>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * uint32 * bool -> System.Threading.RegisteredWaitHandle
Public Shared Function RegisterWaitForSingleObject (waitObject As WaitHandle, callBack As WaitOrTimerCallback, state As Object, millisecondsTimeOutInterval As UInteger, executeOnlyOnce As Boolean) As RegisteredWaitHandle
Paraméterek
- waitObject
- WaitHandle
A WaitHandle regisztrálandó. Ne használjon másikat WaitHandleMutex.
- callBack
- WaitOrTimerCallback
A WaitOrTimerCallback paraméter jelzésekor waitObject meghívandó meghatalmazott.
- state
- Object
A meghatalmazottnak átadott objektum.
- millisecondsTimeOutInterval
- UInt32
Az időtúllépés ezredmásodpercben. Ha a millisecondsTimeOutInterval paraméter 0 (nulla), a függvény teszteli az objektum állapotát, és azonnal visszaadja. Ha millisecondsTimeOutInterval -1, a függvény időtúllépési időköze soha nem telik el.
- executeOnlyOnce
- Boolean
true annak jelzésére, hogy a szál a meghatalmazott meghívása után már nem fog várni a waitObject paraméteren; false annak jelzésére, hogy az időzítő minden alkalommal alaphelyzetbe áll, amikor a várakozási művelet befejeződik, amíg a várakozási művelet nem lesz regisztrálva.
Válaszok
A RegisteredWaitHandle regisztrált várakozási művelet megszakításához használható.
- Attribútumok
Kivételek
A millisecondsTimeOutInterval paraméter kisebb, mint -1.
Példák
Az alábbi példa bemutatja, hogyan hajthat végre egy megadott visszahívási metódust a RegisterWaitForSingleObject megadott várakozási fogópont jelzésekor. Ebben a példában a visszahívási módszer, WaitProca várakozási fogópont pedig egy AutoResetEvent.
A példa meghatároz egy osztályt TaskInfo , amely a visszahívásnak átadott adatokat tárolja a végrehajtáskor. A példa létrehoz egy TaskInfo objektumot, és sztringadatokat rendel hozzá. A RegisteredWaitHandle metódus által visszaadott értéket a RegisterWaitForSingleObject rendszer az HandleTaskInfo objektum mezőjéhez rendeli hozzá, hogy a visszahívási metódus hozzáférhessen a RegisteredWaitHandle.
A visszahívási metódusnak átadni kívánt objektum megadása mellett TaskInfo a metódus hívása RegisterWaitForSingleObject meghatározza a AutoResetEvent feladat várakozási idejét, a WaitOrTimerCallback visszahívási metódust képviselő WaitProc meghatalmazottat, egy másodperces időtúllépési időközt és több visszahívást.
Amikor a fő szál a metódus meghívásával AutoResetEvent jelzi a Set jelet, a WaitOrTimerCallback meghatalmazott meghívása történik. A WaitProc metódustesztek RegisteredWaitHandle annak megállapítására, hogy történt-e időtúllépés. Ha a visszahívás azért lett meghívva, mert a várakozási leírót jelezték, a WaitProc metódus megszünteti a regisztrációt, és leállítja a RegisteredWaitHandletovábbi visszahívásokat. Időtúllépés esetén a feladat továbbra is várakozik. A WaitProc metódus úgy ér véget, hogy egy üzenetet nyomtat a konzolra.
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
Megjegyzések
Ha befejezte a RegisteredWaitHandle metódus által visszaadott metódus használatát, hívja meg a metódust RegisteredWaitHandle.Unregister a várakozási leíróra mutató hivatkozások kiadásához. Javasoljuk, hogy mindig hívja meg a RegisteredWaitHandle.Unregister metódust, még akkor is, ha megadjatrue.executeOnlyOnce A szemétgyűjtés hatékonyabban működik, ha nem a RegisteredWaitHandle.Unregister regisztrált várakozási leíró véglegesítőjétől függően hívja meg a metódust.
A RegisterWaitForSingleObject metódus várólistára állítja a megadott meghatalmazottat a szálkészletben. A munkavégző szál a következő esetekben hajtja végre a meghatalmazottat:
- A megadott objektum a jelzett állapotban van.
- Az időtúllépési időköz eltelt.
A RegisterWaitForSingleObject metódus ellenőrzi a megadott objektum WaitHandleaktuális állapotát. Ha az objektum állapota nincs aláírva, a metódus regisztrál egy várakozási műveletet. A várakozási műveletet egy szál hajtja végre a szálkészletből. A meghatalmazottat egy feldolgozószál hajtja végre, amikor az objektum állapota jelzést ad, vagy az időtúllépési időköz eltelik. Ha a timeOutInterval paraméter nem 0 (nulla), és a executeOnlyOnce paraméter az false, az időzítő minden alkalommal alaphelyzetbe áll, amikor az eseményt jelzi, vagy az időtúllépési időköz eltelt.
Important
A MutexwaitObject használata nem biztosít kölcsönös kizárást a visszahívások számára, mivel az alapul szolgáló Windows API az alapértelmezett WT_EXECUTEDEFAULT jelzőt használja, így minden visszahívás külön szálkészlet-szálon lesz elküldve.
MutexAhelyett, hogy egy, legfeljebb 1-et tartalmazó számot használjonSemaphore.
A várakozási művelet megszakításához hívja meg a metódust RegisteredWaitHandle.Unregister .
A várakozási szál a Win32 WaitForMultipleObjects függvénnyel figyeli a regisztrált várakozási műveleteket. Ezért ha ugyanazt a natív operációsrendszer-leírót kell használnia több hívásban, RegisterWaitForSingleObjectakkor a Win32 DuplicateHandle függvény használatával duplikálnia kell a leírót. Vegye figyelembe, hogy nem szabad impulzust adni egy eseményobjektumnak RegisterWaitForSingleObject, mert előfordulhat, hogy a várakozási szál nem észleli, hogy az esemény az alaphelyzetbe állítás előtt jelzést ad.
A visszatérés előtt a függvény módosítja bizonyos típusú szinkronizálási objektumok állapotát. A módosítás csak azon objektum esetében történik, amelynek a jelzése miatt a várakozási feltétel teljesült. Egy szemaphore száma például eggyel csökken.
Lásd még
A következőre érvényes:
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
Regisztrál egy meghatalmazottat, aki megvár egy WaitHandleidőtúllépési értéket megadva TimeSpan .
public:
static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::Object ^ state, TimeSpan timeout, bool executeOnlyOnce);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, TimeSpan timeout, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, TimeSpan timeout, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, TimeSpan timeout, bool executeOnlyOnce);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * TimeSpan * bool -> System.Threading.RegisteredWaitHandle
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * TimeSpan * bool -> System.Threading.RegisteredWaitHandle
Public Shared Function RegisterWaitForSingleObject (waitObject As WaitHandle, callBack As WaitOrTimerCallback, state As Object, timeout As TimeSpan, executeOnlyOnce As Boolean) As RegisteredWaitHandle
Paraméterek
- waitObject
- WaitHandle
A WaitHandle regisztrálandó. Ne használjon másikat WaitHandleMutex.
- callBack
- WaitOrTimerCallback
A WaitOrTimerCallback paraméter jelzésekor waitObject meghívandó meghatalmazott.
- state
- Object
A meghatalmazottnak átadott objektum.
- timeout
- TimeSpan
Az időtúllépést egy TimeSpan. Ha timeout 0 (nulla), a függvény teszteli az objektum állapotát, és azonnal visszaadja. Ha timeout -1, a függvény időtúllépési időköze soha nem telik el.
- executeOnlyOnce
- Boolean
true annak jelzésére, hogy a szál a meghatalmazott meghívása után már nem fog várni a waitObject paraméteren; false annak jelzésére, hogy az időzítő minden alkalommal alaphelyzetbe áll, amikor a várakozási művelet befejeződik, amíg a várakozási művelet nem lesz regisztrálva.
Válaszok
Ez RegisteredWaitHandle a natív fogópontot foglalja magában.
- Attribútumok
Kivételek
A timeout paraméter kisebb, mint -1.
A timeout paraméter nagyobb, mint az Int32.MaxValue.
Megjegyzések
Ha befejezte a RegisteredWaitHandle metódus által visszaadott metódus használatát, hívja meg a metódust RegisteredWaitHandle.Unregister a várakozási leíróra mutató hivatkozások kiadásához. Javasoljuk, hogy mindig hívja meg a RegisteredWaitHandle.Unregister metódust, még akkor is, ha megadjatrue.executeOnlyOnce A szemétgyűjtés hatékonyabban működik, ha nem a RegisteredWaitHandle.Unregister regisztrált várakozási leíró véglegesítőjétől függően hívja meg a metódust.
A RegisterWaitForSingleObject metódus várólistára állítja a megadott meghatalmazottat a szálkészletben. A munkavégző szál a következő esetekben hajtja végre a meghatalmazottat:
- A megadott objektum a jelzett állapotban van.
- Az időtúllépési időköz eltelt.
A RegisterWaitForSingleObject metódus ellenőrzi a megadott objektum WaitHandleaktuális állapotát. Ha az objektum állapota nincs aláírva, a metódus regisztrál egy várakozási műveletet. A várakozási műveletet egy szál hajtja végre a szálkészletből. A meghatalmazottat egy feldolgozószál hajtja végre, amikor az objektum állapota jelzést ad, vagy az időtúllépési időköz eltelik. Ha a timeOutInterval paraméter nem 0 (nulla), és a executeOnlyOnce paraméter az false, az időzítő minden alkalommal alaphelyzetbe áll, amikor az eseményt jelzi, vagy az időtúllépési időköz eltelt.
Important
A MutexwaitObject használata nem biztosít kölcsönös kizárást a visszahívások számára, mivel az alapul szolgáló Windows API az alapértelmezett WT_EXECUTEDEFAULT jelzőt használja, így minden visszahívás külön szálkészlet-szálon lesz elküldve.
MutexAhelyett, hogy egy, legfeljebb 1-et tartalmazó számot használjonSemaphore.
A várakozási művelet megszakításához hívja meg a metódust RegisteredWaitHandle.Unregister .
A várakozási szál a Win32 WaitForMultipleObjects függvénnyel figyeli a regisztrált várakozási műveleteket. Ezért ha ugyanazt a natív operációsrendszer-leírót kell használnia több hívásban, RegisterWaitForSingleObjectakkor a Win32 DuplicateHandle függvény használatával duplikálnia kell a leírót. Vegye figyelembe, hogy nem szabad impulzust adni egy eseményobjektumnak RegisterWaitForSingleObject, mert előfordulhat, hogy a várakozási szál nem észleli, hogy az esemény az alaphelyzetbe állítás előtt jelzést ad.
A visszatérés előtt a függvény módosítja bizonyos típusú szinkronizálási objektumok állapotát. A módosítás csak azon objektum esetében történik, amelynek a jelzése miatt a várakozási feltétel teljesült. Egy szemaphore száma például eggyel csökken.
Lásd még
A következőre érvényes:
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle32 bites aláírt egész számot az időtúllépéshez ezredmásodpercben.
public:
static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::Object ^ state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * int * bool -> System.Threading.RegisteredWaitHandle
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * int * bool -> System.Threading.RegisteredWaitHandle
Public Shared Function RegisterWaitForSingleObject (waitObject As WaitHandle, callBack As WaitOrTimerCallback, state As Object, millisecondsTimeOutInterval As Integer, executeOnlyOnce As Boolean) As RegisteredWaitHandle
Paraméterek
- waitObject
- WaitHandle
A WaitHandle regisztrálandó. Ne használjon másikat WaitHandleMutex.
- callBack
- WaitOrTimerCallback
A WaitOrTimerCallback paraméter jelzésekor waitObject meghívandó meghatalmazott.
- state
- Object
A meghatalmazottnak átadott objektum.
- millisecondsTimeOutInterval
- Int32
Az időtúllépés ezredmásodpercben. Ha a millisecondsTimeOutInterval paraméter 0 (nulla), a függvény teszteli az objektum állapotát, és azonnal visszaadja. Ha millisecondsTimeOutInterval -1, a függvény időtúllépési időköze soha nem telik el.
- executeOnlyOnce
- Boolean
true annak jelzésére, hogy a szál a meghatalmazott meghívása után már nem fog várni a waitObject paraméteren; false annak jelzésére, hogy az időzítő minden alkalommal alaphelyzetbe áll, amikor a várakozási művelet befejeződik, amíg a várakozási művelet nem lesz regisztrálva.
Válaszok
Ez RegisteredWaitHandle a natív fogópontot foglalja magában.
- Attribútumok
Kivételek
A millisecondsTimeOutInterval paraméter kisebb, mint -1.
Megjegyzések
Ha befejezte a RegisteredWaitHandle metódus által visszaadott metódus használatát, hívja meg a metódust RegisteredWaitHandle.Unregister a várakozási leíróra mutató hivatkozások kiadásához. Javasoljuk, hogy mindig hívja meg a RegisteredWaitHandle.Unregister metódust, még akkor is, ha megadjatrue.executeOnlyOnce A szemétgyűjtés hatékonyabban működik, ha nem a RegisteredWaitHandle.Unregister regisztrált várakozási leíró véglegesítőjétől függően hívja meg a metódust.
A RegisterWaitForSingleObject metódus várólistára állítja a megadott meghatalmazottat a szálkészletben. A munkavégző szál a következő esetekben hajtja végre a meghatalmazottat:
- A megadott objektum a jelzett állapotban van.
- Az időtúllépési időköz eltelt.
A RegisterWaitForSingleObject metódus ellenőrzi a megadott objektum WaitHandleaktuális állapotát. Ha az objektum állapota nincs aláírva, a metódus regisztrál egy várakozási műveletet. A várakozási műveletet egy szál hajtja végre a szálkészletből. A meghatalmazottat egy feldolgozószál hajtja végre, amikor az objektum állapota jelzést ad, vagy az időtúllépési időköz eltelik. Ha a timeOutInterval paraméter nem 0 (nulla), és a executeOnlyOnce paraméter az false, az időzítő minden alkalommal alaphelyzetbe áll, amikor az eseményt jelzi, vagy az időtúllépési időköz eltelt.
Important
A MutexwaitObject használata nem biztosít kölcsönös kizárást a visszahívások számára, mivel az alapul szolgáló Windows API az alapértelmezett WT_EXECUTEDEFAULT jelzőt használja, így minden visszahívás külön szálkészlet-szálon lesz elküldve.
MutexAhelyett, hogy egy, legfeljebb 1-et tartalmazó számot használjonSemaphore.
A várakozási művelet megszakításához hívja meg a metódust RegisteredWaitHandle.Unregister .
A várakozási szál a Win32 WaitForMultipleObjects függvénnyel figyeli a regisztrált várakozási műveleteket. Ezért ha ugyanazt a natív operációsrendszer-leírót kell használnia több hívásban, RegisterWaitForSingleObjectakkor a Win32 DuplicateHandle függvény használatával duplikálnia kell a leírót. Vegye figyelembe, hogy nem szabad impulzust adni egy eseményobjektumnak RegisterWaitForSingleObject, mert előfordulhat, hogy a várakozási szál nem észleli, hogy az esemény az alaphelyzetbe állítás előtt jelzést ad.
A visszatérés előtt a függvény módosítja bizonyos típusú szinkronizálási objektumok állapotát. A módosítás csak azon objektum esetében történik, amelynek a jelzése miatt a várakozási feltétel teljesült. Egy szemaphore száma például eggyel csökken.
Lásd még
A következőre érvényes:
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
- Forrás:
- ThreadPoolWorkQueue.cs
Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle64 bites aláírt egész számot az időtúllépéshez ezredmásodpercben.
public:
static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::Object ^ state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object? state, long millisecondsTimeOutInterval, bool executeOnlyOnce);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * int64 * bool -> System.Threading.RegisteredWaitHandle
static member RegisterWaitForSingleObject : System.Threading.WaitHandle * System.Threading.WaitOrTimerCallback * obj * int64 * bool -> System.Threading.RegisteredWaitHandle
Public Shared Function RegisterWaitForSingleObject (waitObject As WaitHandle, callBack As WaitOrTimerCallback, state As Object, millisecondsTimeOutInterval As Long, executeOnlyOnce As Boolean) As RegisteredWaitHandle
Paraméterek
- waitObject
- WaitHandle
A WaitHandle regisztrálandó. Ne használjon másikat WaitHandleMutex.
- callBack
- WaitOrTimerCallback
A WaitOrTimerCallback paraméter jelzésekor waitObject meghívandó meghatalmazott.
- state
- Object
A meghatalmazottnak átadott objektum.
- millisecondsTimeOutInterval
- Int64
Az időtúllépés ezredmásodpercben. Ha a millisecondsTimeOutInterval paraméter 0 (nulla), a függvény teszteli az objektum állapotát, és azonnal visszaadja. Ha millisecondsTimeOutInterval -1, a függvény időtúllépési időköze soha nem telik el.
- executeOnlyOnce
- Boolean
true annak jelzésére, hogy a szál a meghatalmazott meghívása után már nem fog várni a waitObject paraméteren; false annak jelzésére, hogy az időzítő minden alkalommal alaphelyzetbe áll, amikor a várakozási művelet befejeződik, amíg a várakozási művelet nem lesz regisztrálva.
Válaszok
Ez RegisteredWaitHandle a natív fogópontot foglalja magában.
- Attribútumok
Kivételek
A millisecondsTimeOutInterval paraméter kisebb, mint -1.
Megjegyzések
Ha befejezte a RegisteredWaitHandle metódus által visszaadott metódus használatát, hívja meg a metódust RegisteredWaitHandle.Unregister a várakozási leíróra mutató hivatkozások kiadásához. Javasoljuk, hogy mindig hívja meg a RegisteredWaitHandle.Unregister metódust, még akkor is, ha megadjatrue.executeOnlyOnce A szemétgyűjtés hatékonyabban működik, ha nem a RegisteredWaitHandle.Unregister regisztrált várakozási leíró véglegesítőjétől függően hívja meg a metódust.
A RegisterWaitForSingleObject metódus várólistára állítja a megadott meghatalmazottat a szálkészletben. A munkavégző szál a következő esetekben hajtja végre a meghatalmazottat:
- A megadott objektum a jelzett állapotban van.
- Az időtúllépési időköz eltelt.
A RegisterWaitForSingleObject metódus ellenőrzi a megadott objektum WaitHandleaktuális állapotát. Ha az objektum állapota nincs aláírva, a metódus regisztrál egy várakozási műveletet. A várakozási műveletet egy szál hajtja végre a szálkészletből. A meghatalmazottat egy feldolgozószál hajtja végre, amikor az objektum állapota jelzést ad, vagy az időtúllépési időköz eltelik. Ha a timeOutInterval paraméter nem 0 (nulla), és a executeOnlyOnce paraméter az false, az időzítő minden alkalommal alaphelyzetbe áll, amikor az eseményt jelzi, vagy az időtúllépési időköz eltelt.
Important
A MutexwaitObject használata nem biztosít kölcsönös kizárást a visszahívások számára, mivel az alapul szolgáló Windows API az alapértelmezett WT_EXECUTEDEFAULT jelzőt használja, így minden visszahívás külön szálkészlet-szálon lesz elküldve.
MutexAhelyett, hogy egy, legfeljebb 1-et tartalmazó számot használjonSemaphore.
A várakozási művelet megszakításához hívja meg a metódust RegisteredWaitHandle.Unregister .
A várakozási szál a Win32 WaitForMultipleObjects függvénnyel figyeli a regisztrált várakozási műveleteket. Ezért ha ugyanazt a natív operációsrendszer-leírót kell használnia több hívásban, RegisterWaitForSingleObjectakkor a Win32 DuplicateHandle függvény használatával duplikálnia kell a leírót. Vegye figyelembe, hogy nem szabad impulzust adni egy eseményobjektumnak RegisterWaitForSingleObject, mert előfordulhat, hogy a várakozási szál nem észleli, hogy az esemény az alaphelyzetbe állítás előtt jelzést ad.
A visszatérés előtt a függvény módosítja bizonyos típusú szinkronizálási objektumok állapotát. A módosítás csak azon objektum esetében történik, amelynek a jelzése miatt a várakozási feltétel teljesült. Egy szemaphore száma például eggyel csökken.