ThreadPool.RegisterWaitForSingleObject Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Inscrit un délégué qui attend un WaitHandle.
Surcharges
| Nom | Description |
|---|---|
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Inscrit un délégué pour attendre un WaitHandleentier non signé 32 bits pour le délai d’attente en millisecondes. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Inscrit un délégué pour attendre un WaitHandle, en spécifiant une TimeSpan valeur pour le délai d’attente. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Inscrit un délégué pour attendre un WaitHandleentier signé 64 bits en millisecondes. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Inscrit un délégué pour attendre un WaitHandleentier signé 32 bits en millisecondes. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)
Important
Cette API n’est pas conforme CLS.
Inscrit un délégué pour attendre un WaitHandleentier non signé 32 bits pour le délai d’attente en millisecondes.
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)]
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject(System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce);
[<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ètres
- waitObject
- WaitHandle
À WaitHandle inscrire. Utilisez un WaitHandle autre que Mutex.
- callBack
- WaitOrTimerCallback
Délégué WaitOrTimerCallback à appeler lorsque le waitObject paramètre est signalé.
- state
- Object
Objet transmis au délégué.
- millisecondsTimeOutInterval
- UInt32
Délai d’expiration en millisecondes. Si le millisecondsTimeOutInterval paramètre est égal à 0 (zéro), la fonction teste l’état de l’objet et retourne immédiatement. Si millisecondsTimeOutInterval la valeur est -1, l’intervalle de délai d’attente de la fonction n’est jamais écoulé.
- executeOnlyOnce
- Boolean
true pour indiquer que le thread n’attend plus sur le waitObject paramètre une fois le délégué appelé ; false pour indiquer que le minuteur est réinitialisé chaque fois que l’opération d’attente se termine jusqu’à ce que l’attente soit annulée.
Retours
Qui RegisteredWaitHandle peut être utilisé pour annuler l’opération d’attente inscrite.
- Attributs
Exceptions
Le millisecondsTimeOutInterval paramètre est inférieur à -1.
Exemples
L’exemple suivant montre comment utiliser la RegisterWaitForSingleObject méthode pour exécuter une méthode de rappel spécifiée lorsqu’un handle d’attente spécifié est signalé. Dans cet exemple, la méthode de rappel est WaitProc, et le handle d’attente est un AutoResetEvent.
L’exemple définit une TaskInfo classe pour contenir les informations transmises au rappel lorsqu’elle s’exécute. L’exemple crée un TaskInfo objet et lui affecte des données de chaîne. La RegisteredWaitHandle méthode renvoyée par la RegisterWaitForSingleObject méthode est affectée au Handle champ de l’objet TaskInfo afin que la méthode de rappel ait accès à l’objet RegisteredWaitHandle.
Outre la spécification TaskInfo en tant qu’objet à passer à la méthode de rappel, l’appel à la RegisterWaitForSingleObject méthode spécifie que AutoResetEvent la tâche attend, un WaitOrTimerCallback délégué qui représente la WaitProc méthode de rappel, un intervalle de délai d’attente d’une seconde et plusieurs rappels.
Lorsque le thread principal signale l’appel AutoResetEvent de sa Set méthode, le WaitOrTimerCallback délégué est appelé. Les WaitProc tests RegisteredWaitHandle de méthode pour déterminer si un délai d’attente s’est produit. Si le rappel a été appelé parce que le handle d’attente a été signalé, la WaitProc méthode annule l’inscription de la RegisteredWaitHandleméthode , arrêtant les rappels supplémentaires. Dans le cas d’un délai d’attente, la tâche continue d’attendre. La WaitProc méthode se termine par l’impression d’un message dans la console.
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
Remarques
Lorsque vous avez terminé d’utiliser l’élément RegisteredWaitHandle retourné par cette méthode, appelez sa RegisteredWaitHandle.Unregister méthode pour libérer des références au handle d’attente. Nous vous recommandons d’appeler toujours la RegisteredWaitHandle.Unregister méthode, même si vous spécifiez true pour executeOnlyOnce. Le garbage collection fonctionne plus efficacement si vous appelez la RegisteredWaitHandle.Unregister méthode au lieu de dépendre du finaliseur du handle d’attente inscrit.
La RegisterWaitForSingleObject méthode met en file d’attente le délégué spécifié au pool de threads. Un thread de travail exécute le délégué lorsque l’un des événements suivants se produit :
- L’objet spécifié est dans l’état signalé.
- L’intervalle de délai d’attente s’écoule.
La RegisterWaitForSingleObject méthode vérifie l’état actuel de l’objet WaitHandlespécifié. Si l’état de l’objet n’est pas signé, la méthode inscrit une opération d’attente. L’opération d’attente est effectuée par un thread du pool de threads. Le délégué est exécuté par un thread de travail lorsque l’état de l’objet devient signalé ou que l’intervalle de délai d’attente s’écoule. Si le timeOutInterval paramètre n’est pas 0 (zéro) et que le executeOnlyOnce paramètre est false, le minuteur est réinitialisé chaque fois que l’événement est signalé ou que l’intervalle de délai d’attente s’écoule.
Important
L’utilisation d’un Mutex pour waitObject ne fournit pas d’exclusion mutuelle pour les rappels, car l’API Windows sous-jacente utilise l’indicateur par défaut WT_EXECUTEDEFAULT, de sorte que chaque rappel est distribué sur un thread de pool de threads distinct. Au lieu d’un Mutex, utilisez un Semaphore nombre maximal de 1.
Pour annuler l’opération d’attente, appelez la RegisteredWaitHandle.Unregister méthode.
Le thread d’attente utilise la fonction Win32 WaitForMultipleObjects pour surveiller les opérations d’attente inscrites. Par conséquent, si vous devez utiliser le même handle de système d’exploitation natif dans plusieurs appels, RegisterWaitForSingleObjectvous devez dupliquer le handle à l’aide de la fonction Win32 DuplicateHandle . Notez que vous ne devez pas pulser un objet d’événement passé, RegisterWaitForSingleObjectcar le thread d’attente peut ne pas détecter que l’événement est signalé avant sa réinitialisation.
Avant de retourner, la fonction modifie l’état de certains types d’objets de synchronisation. La modification se produit uniquement pour l’objet dont l’état signalé a provoqué la satisfaction de la condition d’attente. Par exemple, le nombre d’un sémaphore est diminué d’un.
Voir aussi
S’applique à
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)
Inscrit un délégué pour attendre un WaitHandle, en spécifiant une TimeSpan valeur pour le délai d’attente.
public:
static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::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);
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ètres
- waitObject
- WaitHandle
À WaitHandle inscrire. Utilisez un WaitHandle autre que Mutex.
- callBack
- WaitOrTimerCallback
Délégué WaitOrTimerCallback à appeler lorsque le waitObject paramètre est signalé.
- state
- Object
Objet transmis au délégué.
- timeout
- TimeSpan
Délai d’attente représenté par un TimeSpan. Si timeout la valeur est 0 (zéro), la fonction teste l’état de l’objet et retourne immédiatement. Si timeout la valeur est -1, l’intervalle de délai d’attente de la fonction n’est jamais écoulé.
- executeOnlyOnce
- Boolean
true pour indiquer que le thread n’attend plus sur le waitObject paramètre une fois le délégué appelé ; false pour indiquer que le minuteur est réinitialisé chaque fois que l’opération d’attente se termine jusqu’à ce que l’attente soit annulée.
Retours
Qui RegisteredWaitHandle encapsule le handle natif.
Exceptions
Le timeout paramètre est inférieur à -1.
Le timeout paramètre est supérieur à Int32.MaxValue.
Remarques
Lorsque vous avez terminé d’utiliser l’élément RegisteredWaitHandle retourné par cette méthode, appelez sa RegisteredWaitHandle.Unregister méthode pour libérer des références au handle d’attente. Nous vous recommandons d’appeler toujours la RegisteredWaitHandle.Unregister méthode, même si vous spécifiez true pour executeOnlyOnce. Le garbage collection fonctionne plus efficacement si vous appelez la RegisteredWaitHandle.Unregister méthode au lieu de dépendre du finaliseur du handle d’attente inscrit.
La RegisterWaitForSingleObject méthode met en file d’attente le délégué spécifié au pool de threads. Un thread de travail exécute le délégué lorsque l’un des événements suivants se produit :
- L’objet spécifié est dans l’état signalé.
- L’intervalle de délai d’attente s’écoule.
La RegisterWaitForSingleObject méthode vérifie l’état actuel de l’objet WaitHandlespécifié. Si l’état de l’objet n’est pas signé, la méthode inscrit une opération d’attente. L’opération d’attente est effectuée par un thread du pool de threads. Le délégué est exécuté par un thread de travail lorsque l’état de l’objet devient signalé ou que l’intervalle de délai d’attente s’écoule. Si le timeOutInterval paramètre n’est pas 0 (zéro) et que le executeOnlyOnce paramètre est false, le minuteur est réinitialisé chaque fois que l’événement est signalé ou que l’intervalle de délai d’attente s’écoule.
Important
L’utilisation d’un Mutex pour waitObject ne fournit pas d’exclusion mutuelle pour les rappels, car l’API Windows sous-jacente utilise l’indicateur par défaut WT_EXECUTEDEFAULT, de sorte que chaque rappel est distribué sur un thread de pool de threads distinct. Au lieu d’un Mutex, utilisez un Semaphore nombre maximal de 1.
Pour annuler l’opération d’attente, appelez la RegisteredWaitHandle.Unregister méthode.
Le thread d’attente utilise la fonction Win32 WaitForMultipleObjects pour surveiller les opérations d’attente inscrites. Par conséquent, si vous devez utiliser le même handle de système d’exploitation natif dans plusieurs appels, RegisterWaitForSingleObjectvous devez dupliquer le handle à l’aide de la fonction Win32 DuplicateHandle . Notez que vous ne devez pas pulser un objet d’événement passé, RegisterWaitForSingleObjectcar le thread d’attente peut ne pas détecter que l’événement est signalé avant sa réinitialisation.
Avant de retourner, la fonction modifie l’état de certains types d’objets de synchronisation. La modification se produit uniquement pour l’objet dont l’état signalé a provoqué la satisfaction de la condition d’attente. Par exemple, le nombre d’un sémaphore est diminué d’un.
Voir aussi
S’applique à
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)
Inscrit un délégué pour attendre un WaitHandleentier signé 64 bits en millisecondes.
public:
static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::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);
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ètres
- waitObject
- WaitHandle
À WaitHandle inscrire. Utilisez un WaitHandle autre que Mutex.
- callBack
- WaitOrTimerCallback
Délégué WaitOrTimerCallback à appeler lorsque le waitObject paramètre est signalé.
- state
- Object
Objet transmis au délégué.
- millisecondsTimeOutInterval
- Int64
Délai d’expiration en millisecondes. Si le millisecondsTimeOutInterval paramètre est égal à 0 (zéro), la fonction teste l’état de l’objet et retourne immédiatement. Si millisecondsTimeOutInterval la valeur est -1, l’intervalle de délai d’attente de la fonction n’est jamais écoulé.
- executeOnlyOnce
- Boolean
true pour indiquer que le thread n’attend plus sur le waitObject paramètre une fois le délégué appelé ; false pour indiquer que le minuteur est réinitialisé chaque fois que l’opération d’attente se termine jusqu’à ce que l’attente soit annulée.
Retours
Qui RegisteredWaitHandle encapsule le handle natif.
Exceptions
Le millisecondsTimeOutInterval paramètre est inférieur à -1.
Remarques
Lorsque vous avez terminé d’utiliser l’élément RegisteredWaitHandle retourné par cette méthode, appelez sa RegisteredWaitHandle.Unregister méthode pour libérer des références au handle d’attente. Nous vous recommandons d’appeler toujours la RegisteredWaitHandle.Unregister méthode, même si vous spécifiez true pour executeOnlyOnce. Le garbage collection fonctionne plus efficacement si vous appelez la RegisteredWaitHandle.Unregister méthode au lieu de dépendre du finaliseur du handle d’attente inscrit.
La RegisterWaitForSingleObject méthode met en file d’attente le délégué spécifié au pool de threads. Un thread de travail exécute le délégué lorsque l’un des événements suivants se produit :
- L’objet spécifié est dans l’état signalé.
- L’intervalle de délai d’attente s’écoule.
La RegisterWaitForSingleObject méthode vérifie l’état actuel de l’objet WaitHandlespécifié. Si l’état de l’objet n’est pas signé, la méthode inscrit une opération d’attente. L’opération d’attente est effectuée par un thread du pool de threads. Le délégué est exécuté par un thread de travail lorsque l’état de l’objet devient signalé ou que l’intervalle de délai d’attente s’écoule. Si le timeOutInterval paramètre n’est pas 0 (zéro) et que le executeOnlyOnce paramètre est false, le minuteur est réinitialisé chaque fois que l’événement est signalé ou que l’intervalle de délai d’attente s’écoule.
Important
L’utilisation d’un Mutex pour waitObject ne fournit pas d’exclusion mutuelle pour les rappels, car l’API Windows sous-jacente utilise l’indicateur par défaut WT_EXECUTEDEFAULT, de sorte que chaque rappel est distribué sur un thread de pool de threads distinct. Au lieu d’un Mutex, utilisez un Semaphore nombre maximal de 1.
Pour annuler l’opération d’attente, appelez la RegisteredWaitHandle.Unregister méthode.
Le thread d’attente utilise la fonction Win32 WaitForMultipleObjects pour surveiller les opérations d’attente inscrites. Par conséquent, si vous devez utiliser le même handle de système d’exploitation natif dans plusieurs appels, RegisterWaitForSingleObjectvous devez dupliquer le handle à l’aide de la fonction Win32 DuplicateHandle . Notez que vous ne devez pas pulser un objet d’événement passé, RegisterWaitForSingleObjectcar le thread d’attente peut ne pas détecter que l’événement est signalé avant sa réinitialisation.
Avant de retourner, la fonction modifie l’état de certains types d’objets de synchronisation. La modification se produit uniquement pour l’objet dont l’état signalé a provoqué la satisfaction de la condition d’attente. Par exemple, le nombre d’un sémaphore est diminué d’un.
Voir aussi
S’applique à
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)
Inscrit un délégué pour attendre un WaitHandleentier signé 32 bits en millisecondes.
public:
static System::Threading::RegisteredWaitHandle ^ RegisterWaitForSingleObject(System::Threading::WaitHandle ^ waitObject, System::Threading::WaitOrTimerCallback ^ callBack, System::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);
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ètres
- waitObject
- WaitHandle
À WaitHandle inscrire. Utilisez un WaitHandle autre que Mutex.
- callBack
- WaitOrTimerCallback
Délégué WaitOrTimerCallback à appeler lorsque le waitObject paramètre est signalé.
- state
- Object
Objet passé au délégué.
- millisecondsTimeOutInterval
- Int32
Délai d’expiration en millisecondes. Si le millisecondsTimeOutInterval paramètre est égal à 0 (zéro), la fonction teste l’état de l’objet et retourne immédiatement. Si millisecondsTimeOutInterval la valeur est -1, l’intervalle de délai d’attente de la fonction n’est jamais écoulé.
- executeOnlyOnce
- Boolean
true pour indiquer que le thread n’attend plus sur le waitObject paramètre une fois le délégué appelé ; false pour indiquer que le minuteur est réinitialisé chaque fois que l’opération d’attente se termine jusqu’à ce que l’attente soit annulée.
Retours
Qui RegisteredWaitHandle encapsule le handle natif.
Exceptions
Le millisecondsTimeOutInterval paramètre est inférieur à -1.
Remarques
Lorsque vous avez terminé d’utiliser l’élément RegisteredWaitHandle retourné par cette méthode, appelez sa RegisteredWaitHandle.Unregister méthode pour libérer des références au handle d’attente. Nous vous recommandons d’appeler toujours la RegisteredWaitHandle.Unregister méthode, même si vous spécifiez true pour executeOnlyOnce. Le garbage collection fonctionne plus efficacement si vous appelez la RegisteredWaitHandle.Unregister méthode au lieu de dépendre du finaliseur du handle d’attente inscrit.
La RegisterWaitForSingleObject méthode met en file d’attente le délégué spécifié au pool de threads. Un thread de travail exécute le délégué lorsque l’un des événements suivants se produit :
- L’objet spécifié est dans l’état signalé.
- L’intervalle de délai d’attente s’écoule.
La RegisterWaitForSingleObject méthode vérifie l’état actuel de l’objet WaitHandlespécifié. Si l’état de l’objet n’est pas signé, la méthode inscrit une opération d’attente. L’opération d’attente est effectuée par un thread du pool de threads. Le délégué est exécuté par un thread de travail lorsque l’état de l’objet devient signalé ou que l’intervalle de délai d’attente s’écoule. Si le timeOutInterval paramètre n’est pas 0 (zéro) et que le executeOnlyOnce paramètre est false, le minuteur est réinitialisé chaque fois que l’événement est signalé ou que l’intervalle de délai d’attente s’écoule.
Important
L’utilisation d’un Mutex pour waitObject ne fournit pas d’exclusion mutuelle pour les rappels, car l’API Windows sous-jacente utilise l’indicateur par défaut WT_EXECUTEDEFAULT, de sorte que chaque rappel est distribué sur un thread de pool de threads distinct. Au lieu d’un Mutex, utilisez un Semaphore nombre maximal de 1.
Pour annuler l’opération d’attente, appelez la RegisteredWaitHandle.Unregister méthode.
Le thread d’attente utilise la fonction Win32 WaitForMultipleObjects pour surveiller les opérations d’attente inscrites. Par conséquent, si vous devez utiliser le même handle de système d’exploitation natif dans plusieurs appels, RegisterWaitForSingleObjectvous devez dupliquer le handle à l’aide de la fonction Win32 DuplicateHandle . Notez que vous ne devez pas pulser un objet d’événement passé, RegisterWaitForSingleObjectcar le thread d’attente peut ne pas détecter que l’événement est signalé avant sa réinitialisation.
Avant de retourner, la fonction modifie l’état de certains types d’objets de synchronisation. La modification se produit uniquement pour l’objet dont l’état signalé a provoqué la satisfaction de la condition d’attente. Par exemple, le nombre d’un sémaphore est diminué d’un.