Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais

Control.InvokeRequired propriété

 

Date de publication : novembre 2016

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

Espace de noms:   System.Windows.Forms
Assembly:  System.Windows.Forms (dans System.Windows.Forms.dll)

[BrowsableAttribute(false)]
public bool InvokeRequired { get; }

Valeur de propriété

Type: System.Boolean

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.

Contrôles dans les Windows Forms sont liés à un thread spécifique et ne sont pas thread-safe. Par conséquent, si vous appelez une méthode de contrôle d’un thread différent, vous devez utiliser une des méthodes pour marshaler l’appel au thread approprié d’appel du contrôle. 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.

System_CAPS_noteRemarque

Outre le InvokeRequired propriété, il existe quatre méthodes sur un contrôle qui sont thread-safe à appeler : Invoke,BeginInvoke, EndInvoke et CreateGraphics Si le handle du contrôle a déjà été créé. L’appel CreateGraphics avant que le handle du contrôle a été créé sur un thread d’arrière-plan peut entraîner des appels du thread inter illégaux. Tous les autres appels de méthode, vous devez utiliser une de ces méthodes invoke lors de l’appel à partir d’un thread différent.

Si le handle du contrôle n’existe pas encore, InvokeRequired recherches jusqu'à la chaîne du contrôle parent jusqu'à ce qu’il trouve un contrôle ou un formulaire avec un handle de fenêtre. Si aucun handle approprié n’est trouvé, le InvokeRequired méthode renvoie false.

Cela signifie que InvokeRequiredpeut 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éé.

Dans le cas où le handle du contrôle n’a pas encore été créé, vous ne devez pas simplement appeler des méthodes, des propriétés ou des événements sur le contrôle. Cela peut provoquer le handle du contrôle doit être créé sur le thread d’arrière-plan, isolant ainsi le contrôle sur un thread sans pompe de messages et rendant l’application instable.

Vous pouvez éviter cela en vérifiant également la valeur de IsHandleCreated lorsque InvokeRequired renvoie false sur un thread d’arrière-plan. Si le handle du contrôle n’a pas encore été créé, vous devez attendre jusqu'à ce qu’il a été créé avant d’appeler Invoke ou BeginInvoke. En général, 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 l’affichage de l’écran ou Application.Run a été appelée.

Une solution consiste à attendre que le handle du formulaire a été créé avant de démarrer le thread d’arrière-plan. Soit forcer la création du handle en appelant le Handle propriété, ou patientez jusqu'à ce que le Load événement pour démarrer le processus d’arrière-plan.

Une solution plus efficace consiste à utiliser le SynchronizationContext retourné par SynchronizationContext au lieu d’un contrôle pour marshaling inter-threads.

System_CAPS_noteRemarque

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 Windows Forms multithread, consultez Comment : utiliser un Thread d’arrière-plan pour rechercher des fichiers et Comment : faire des appels Thread-Safe aux contrôles Windows Forms.

.NET Framework
Disponible depuis 1.1
Retour au début
Afficher: