Cette documentation est archivée et n’est pas conservée.

Control.InvokeRequired, propriété

Mise à jour : novembre 2007

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; }
/** @property */
/** @attribute BrowsableAttribute(false) */
public final boolean get_InvokeRequired()

public final function get InvokeRequired () : boolean

Valeur de propriété

Type : System.Boolean

true si le Handle du contrôle a été créé 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émentations

ISynchronizeInvoke.InvokeRequired

Les 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 d'un contrôle à partir d'un autre thread, vous devez utiliser l'une des méthodes Invoke 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.

Remarque :

Outre la propriété InvokeRequired, il existe quatre méthodes sur un contrôle qui sont thread-safe et qui peuvent être appelées : Invoke, BeginInvoke, EndInvoke et CreateGraphics si le handle du contrôle a déjà été créé. 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 illégaux. 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 autre thread.

Si le handle du contrôle n'existe pas encore, InvokeRequired effectuera une recherche dans la chaîne parente du contrôle jusqu'à ce qu'elle trouve un contrôle ou un formulaire avec un handle de fenêtre. Si aucun handle approprié n'est trouvé, la méthode InvokeRequired retourne 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éé.

Si le handle du contrôle n'a pas encore été créé, vous ne devez pas appeler de propriétés, de méthodes ou d'événements sur le contrôle. Cela peut entraîner la création du handle 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 retourne false sur un thread d'arrière-plan. Vous devez attendre que handle du contrôle soit créé avant d'appeler Invoke ou BeginInvoke. En général, il faut attendre uniquement la création d'un thread d'arrière-plan dans le constructeur du formulaire principal de l'application (comme dans Application.Run(new MainForm()), avant l'affichage du formulaire ou l'appel à Application.Run).

Une solution consiste à attendre que le handle du formulaire soit créé avant de démarrer le thread d'arrière-plan. Vous devez soit forcer la création du handle en appelant la propriété Handle, soit attendre l'événement Load pour démarrer le processus d'arrière-plan.

Une solution plus efficace consiste à utiliser SynchronizationContext retourné par SynchronizationContext plutôt qu'un contrôle pour marshaling inter-threads.

Remarque :

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.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professionnel Édition x64, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile pour Smartphone, Windows Mobile pour Pocket PC

Le .NET Framework et le .NET Compact Framework ne prennent pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

.NET Framework

Pris en charge dans : 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Pris en charge dans : 3.5, 2.0
Afficher: