Partager via


ThreadPool.RegisterWaitForSingleObject Méthode

Définition

Inscrit un délégué en attente de WaitHandle.

Surcharges

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier 32 bits non signé.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Inscrit un délégué en attente de WaitHandle, en spécifiant une valeur TimeSpan pour indiquer le délai.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier 32 bits signé.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier 64 bits signé.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs

Important

Cette API n’est pas conforme CLS.

Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier 32 bits non signé.

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ètres

waitObject
WaitHandle

WaitHandle à inscrire. Utilisez un WaitHandle autre que Mutex.

callBack
WaitOrTimerCallback

Délégué WaitOrTimerCallback à appeler lorsque le paramètre waitObject est signalé.

state
Object

Objet passé au délégué.

millisecondsTimeOutInterval
UInt32

Délai en millisecondes. Si le paramètre millisecondsTimeOutInterval a la valeur zéro (0), la fonction teste l'état de l'objet et procède à un retour immédiat. Si millisecondsTimeOutInterval a la valeur -1, le délai d'expiration de la fonction ne prend jamais fin.

executeOnlyOnce
Boolean

true pour indiquer que le thread ne tiendra plus compte du paramètre waitObject une fois le délégué appelé ; false pour indiquer que la minuterie sera réinitialisée à chaque achèvement d'opération d'attente, jusqu'à annulation de l'inscription de l'attente.

Retours

RegisteredWaitHandle pouvant être utilisé pour annuler l'opération d'attente inscrite.

Attributs

Exceptions

Le paramètre millisecondsTimeOutInterval 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 passées au rappel lors de son exécution. L’exemple crée un TaskInfo objet et lui attribue des données de chaîne. qui RegisteredWaitHandle est retourné par la RegisterWaitForSingleObject méthode est affecté au Handle champ de l’objet TaskInfo afin que la méthode de rappel ait accès à .RegisteredWaitHandle

En plus de spécifier TaskInfo comme objet à passer à la méthode de rappel, l’appel à la RegisterWaitForSingleObject méthode spécifie le AutoResetEvent que la tâche attendra, un délégué qui représente la WaitProc méthode de rappel, un WaitOrTimerCallback délai d’expiration d’une seconde et plusieurs rappels.

Lorsque le thread main signale le AutoResetEvent en appelant sa Set méthode, le WaitOrTimerCallback délégué est appelé. La WaitProc méthode teste RegisteredWaitHandle 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 RegisteredWaitHandle, 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 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

Remarques

Lorsque vous avez terminé d’utiliser le RegisteredWaitHandle qui est retourné par cette méthode, appelez sa RegisteredWaitHandle.Unregister méthode pour libérer les références au handle d’attente. Nous vous recommandons de toujours appeler 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é vers le 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 à 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 est 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 for waitObject ne fournit pas d’exclusion Mutex mutuelle pour les rappels, car l’API Windows sous-jacente utilise l’indicateur par défautWT_EXECUTEDEFAULT, de sorte que chaque rappel est distribué sur un thread de pool de threads distinct. Au lieu d’un Mutex, utilisez un Semaphore avec un 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 à , vous devez dupliquer le handle à RegisterWaitForSingleObjectl’aide de la fonction Win32 DuplicateHandle . Notez que vous ne devez pas pulser un objet d’événement passé à RegisterWaitForSingleObject, car 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 entraîné la satisfaction de la condition d’attente. Par exemple, le nombre d’un sémaphore est réduit d’un.

Voir aussi

S’applique à

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs

Inscrit un délégué en attente de WaitHandle, en spécifiant une valeur TimeSpan pour indiquer le délai.

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ètres

waitObject
WaitHandle

WaitHandle à inscrire. Utilisez un WaitHandle autre que Mutex.

callBack
WaitOrTimerCallback

Délégué WaitOrTimerCallback à appeler lorsque le paramètre waitObject est signalé.

state
Object

Objet passé au délégué.

timeout
TimeSpan

Délai représenté par TimeSpan. Si le paramètre timeout a la valeur zéro, la fonction teste l'état de l'objet et procède à un retour immédiat. Si timeout a la valeur -1, le délai d'expiration de la fonction ne prend jamais fin.

executeOnlyOnce
Boolean

true pour indiquer que le thread ne tiendra plus compte du paramètre waitObject une fois le délégué appelé ; false pour indiquer que la minuterie sera réinitialisée à chaque achèvement d'opération d'attente, jusqu'à annulation de l'inscription de l'attente.

Retours

RegisteredWaitHandle qui encapsule le handle natif.

Attributs

Exceptions

Le paramètre timeout est inférieur à -1.

Le timeout paramètre est supérieur à Int32.MaxValue.

Remarques

Lorsque vous avez terminé d’utiliser le RegisteredWaitHandle qui est retourné par cette méthode, appelez sa RegisteredWaitHandle.Unregister méthode pour libérer les références au handle d’attente. Nous vous recommandons de toujours appeler 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é vers le 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 à 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 est 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 for waitObject ne fournit pas d’exclusion Mutex mutuelle pour les rappels, car l’API Windows sous-jacente utilise l’indicateur par défautWT_EXECUTEDEFAULT, de sorte que chaque rappel est distribué sur un thread de pool de threads distinct. Au lieu d’un Mutex, utilisez un Semaphore avec un 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 à , vous devez dupliquer le handle à RegisterWaitForSingleObjectl’aide de la fonction Win32 DuplicateHandle . Notez que vous ne devez pas pulser un objet d’événement passé à RegisterWaitForSingleObject, car 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 entraîné la satisfaction de la condition d’attente. Par exemple, le nombre d’un sémaphore est réduit d’un.

Voir aussi

S’applique à

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs

Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier 32 bits signé.

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ètres

waitObject
WaitHandle

WaitHandle à inscrire. Utilisez un WaitHandle autre que Mutex.

callBack
WaitOrTimerCallback

Délégué WaitOrTimerCallback à appeler lorsque le paramètre waitObject est signalé.

state
Object

Objet passé au délégué.

millisecondsTimeOutInterval
Int32

Délai en millisecondes. Si le paramètre millisecondsTimeOutInterval a la valeur zéro (0), la fonction teste l'état de l'objet et procède à un retour immédiat. Si millisecondsTimeOutInterval a la valeur -1, le délai d'expiration de la fonction ne prend jamais fin.

executeOnlyOnce
Boolean

true pour indiquer que le thread ne tiendra plus compte du paramètre waitObject une fois le délégué appelé ; false pour indiquer que la minuterie sera réinitialisée à chaque achèvement d'opération d'attente, jusqu'à annulation de l'inscription de l'attente.

Retours

RegisteredWaitHandle qui encapsule le handle natif.

Attributs

Exceptions

Le paramètre millisecondsTimeOutInterval est inférieur à -1.

Remarques

Lorsque vous avez terminé d’utiliser le RegisteredWaitHandle qui est retourné par cette méthode, appelez sa RegisteredWaitHandle.Unregister méthode pour libérer les 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é dans le pool de threads. Un thread de travail exécute le délégué quand l’un des événements suivants se produit :

  • L’objet spécifié est à 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 enregistre 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 est 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 avec un 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 à , vous devez dupliquer le handle à RegisterWaitForSingleObjectl’aide de la fonction Win32 DuplicateHandle . Notez que vous ne devez pas pulser un objet événement passé à RegisterWaitForSingleObject, car 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 réduit d’un.

Voir aussi

S’applique à

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs

Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier 64 bits signé.

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ètres

waitObject
WaitHandle

WaitHandle à inscrire. Utilisez un WaitHandle autre que Mutex.

callBack
WaitOrTimerCallback

Délégué WaitOrTimerCallback à appeler lorsque le paramètre waitObject est signalé.

state
Object

Objet passé au délégué.

millisecondsTimeOutInterval
Int64

Délai en millisecondes. Si le paramètre millisecondsTimeOutInterval a la valeur zéro (0), la fonction teste l'état de l'objet et procède à un retour immédiat. Si millisecondsTimeOutInterval a la valeur -1, le délai d'expiration de la fonction ne prend jamais fin.

executeOnlyOnce
Boolean

true pour indiquer que le thread ne tiendra plus compte du paramètre waitObject une fois le délégué appelé ; false pour indiquer que la minuterie sera réinitialisée à chaque achèvement d'opération d'attente, jusqu'à annulation de l'inscription de l'attente.

Retours

RegisteredWaitHandle qui encapsule le handle natif.

Attributs

Exceptions

Le paramètre millisecondsTimeOutInterval est inférieur à -1.

Remarques

Lorsque vous avez terminé d’utiliser le RegisteredWaitHandle qui est retourné par cette méthode, appelez sa RegisteredWaitHandle.Unregister méthode pour libérer les 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é dans le pool de threads. Un thread de travail exécute le délégué quand l’un des événements suivants se produit :

  • L’objet spécifié est à 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 enregistre 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 est 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 avec un 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 à , vous devez dupliquer le handle à RegisterWaitForSingleObjectl’aide de la fonction Win32 DuplicateHandle . Notez que vous ne devez pas pulser un objet événement passé à RegisterWaitForSingleObject, car 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 réduit d’un.

Voir aussi

S’applique à