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éé.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
[<System.ComponentModel.Browsable(false)>]
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.

Implémente

Attributs

Remarques

Les contrôles dans Windows Forms sont liés à un thread spécifique et ne sont pas 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 d’appel du contrôle pour marshaler l’appel au thread approprié. 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.

Notes

En plus de la InvokeRequired propriété , il existe quatre méthodes sur un contrôle qui sont thread-safe à appeler : Invoke, EndInvokeBeginInvokeet CreateGraphics si le handle pour le contrôle a déjà été créé. L’appel CreateGraphics avant la création du handle du contrôle sur un thread d’arrière-plan peut entraîner des appels de threads croisés non conformes. Pour tous les autres appels de méthode, vous devez utiliser l’une de ces méthodes d’appel lors de l’appel à partir d’un thread différent.

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. Si aucun handle approprié n’est trouvé, la InvokeRequired méthode retourne false.

Cela signifie que InvokeRequired peut retourner false si Invoke n’est pas obligatoire (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éé.

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. Cela peut entraîner la création du handle du contrôle sur le thread d’arrière-plan, isolant le contrôle sur un thread sans pompe de messages et rendant l’application instable.

Vous pouvez vous protéger contre ce cas en vérifiant également la valeur de IsHandleCreated quand InvokeRequired retourne false sur un thread d’arrière-plan. 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. 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 pour l’application (comme dans Application.Run(new MainForm()), avant que le formulaire ait été affiché ou Application.Run ait été appelé.

Une solution consiste à attendre que le handle du formulaire ait été créé avant de démarrer le thread d’arrière-plan. Forcez la création du handle en appelant la Handle propriété ou attendez que l’événement Load démarre le processus en arrière-plan.

Une meilleure solution consiste à utiliser le retourné par SynchronizationContext plutôt qu’un contrôle pour le SynchronizationContext marshaling inter-thread.

Notes

Une exception peut être levée si le thread qui doit traiter le message n’est plus actif.

Pour plus d’informations sur les contrôles de Windows Forms multithread, consultez How to: Use a Background Thread to Search for Files et How to: Make Thread-Safe Calls to Windows Forms Controls.

S’applique à

Voir aussi