Control.InvokeRequired Propriété
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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.