Control.InvokeRequired Propriété

Définition

Obtient une valeur indiquant si l'appelant doit appeler une méthode Invoke lors d'appels de méthode au contrôle parce que l'appelant se trouve sur un thread différent de celui sur lequel le contrôle a été créé.Gets a value indicating whether the caller must call an invoke method when making method calls to the control because the caller is on a different thread than the one the control was created on.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean

Valeur de propriété

true si la propriété Handle du contrôle a été créée sur un thread différent du thread appelant (ce qui indique que vous devez effectuer les appels au contrôle par l'intermédiaire d'une méthode Invoke) ; sinon, false.true if the control's Handle was created on a different thread than the calling thread (indicating that you must make calls to the control through an invoke method); otherwise, false.

Implémente

Attributs

Remarques

Dans Windows Forms, les contrôles sont liés à un thread spécifique et ne sont pas thread-safe.Controls in Windows Forms are bound to a specific thread and are not thread safe. Par conséquent, si vous appelez la méthode d’un contrôle à partir d’un thread différent, vous devez utiliser l’une des méthodes Invoke du contrôle pour marshaler l’appel au thread approprié.Therefore, if you are calling a control's method from a different thread, you must use one of the control's invoke methods to marshal the call to the proper thread. Cette propriété peut être utilisée pour déterminer si vous devez appeler une méthode Invoke, ce qui peut être utile si vous ne savez pas quel thread possède un contrôle.This property can be used to determine if you must call an invoke method, which can be useful if you do not know what thread owns a control.

Notes

En plus de la propriété InvokeRequired, il existe quatre méthodes sur un contrôle thread-safe à appeler : Invoke, BeginInvoke, EndInvoke et CreateGraphics Si le handle du contrôle a déjà été créé.In addition to the InvokeRequired property, there are four methods on a control that are thread safe to call: Invoke,BeginInvoke, EndInvoke and CreateGraphics if the handle for the control has already been created. L’appel de CreateGraphics avant la création du handle du contrôle sur un thread d’arrière-plan peut entraîner des appels inter-threads non conformes.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Pour tous les autres appels de méthode, vous devez utiliser l’une de ces méthodes Invoke lors de l’appel à partir d’un thread différent.For all other method calls, you should use one of these invoke methods when calling from a different thread.

Si le handle du contrôle n’existe pas encore, InvokeRequired effectue une recherche dans la chaîne parente du contrôle jusqu’à ce qu’il trouve un contrôle ou un formulaire qui a un handle de fenêtre.If the control's handle does not yet exist, InvokeRequired searches up the control's parent chain until it finds a control or form that does have a window handle. Si aucun handle approprié n’est trouvé, la méthode InvokeRequired retourne false.If no appropriate handle can be found, the InvokeRequired method returns false.

Cela signifie que InvokeRequired peut retourner false si Invoke n’est pas requis (l’appel se produit sur le même thread) ou si le contrôle a été créé sur un thread différent mais que le handle du contrôle n’a pas encore été créé.This means that InvokeRequired can return false if Invoke is not required (the call occurs on the same thread), or if the control was created on a different thread but the control's handle has not yet been created.

Dans le cas où le handle du contrôle n’a pas encore été créé, vous ne devez pas simplement appeler des propriétés, des méthodes ou des événements sur le contrôle.In the case where the control's handle has not yet been created, you should not simply call properties, methods, or events on the control. Cela peut entraîner la création du handle du contrôle sur le thread d’arrière-plan, en isolant le contrôle sur un thread sans pompe de messages et en rendant l’application instable.This might cause the control's handle to be created on the background thread, isolating the control on a thread without a message pump and making the application unstable.

Vous pouvez vous protéger contre ce cas en vérifiant également la valeur de IsHandleCreated lorsque InvokeRequired retourne false sur un thread d’arrière-plan.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Si le handle de contrôle n’a pas encore été créé, vous devez attendre qu’il ait été créé avant d’appeler Invoke ou BeginInvoke.If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. En règle générale, cela se produit uniquement si un thread d’arrière-plan est créé dans le constructeur du formulaire principal de l’application (comme dans Application.Run(new MainForm()), avant que le formulaire n’apparaisse ou que Application.Run a été appelé.Typically, this happens only if a background thread is created in the constructor of the primary form for the application (as in Application.Run(new MainForm()), before the form has been shown or Application.Run has been called.

Une solution consiste à attendre la création du handle du formulaire avant le démarrage du thread d’arrière-plan.One solution is to wait until the form's handle has been created before starting the background thread. Forcez la création du handle en appelant la propriété Handle, ou attendez que l’événement Load démarre le processus en arrière-plan.Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

Une solution encore plus efficace consiste à utiliser le SynchronizationContext retourné par SynchronizationContext plutôt qu’un contrôle pour le marshaling inter-threads.An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

Notes

Une exception peut être levée si le thread qui doit traiter le message n’est plus actif.An exception might be thrown if the thread that should process the message is no longer active.

Pour plus d’informations sur les contrôles de Windows Forms multithread, consultez How à : Utilisez un thread d’arrière-plan pour rechercher des fichiers et procédure : Effectuez des appels thread-safe pour Windows Forms contrôles.For more information about multithreaded Windows Forms controls, see How to: Use a Background Thread to Search for Files and How to: Make Thread-Safe Calls to Windows Forms Controls.

S’applique à

Voir aussi