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 d’appel lors de l’appel de méthode au contrôle, car 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 le contrôle Handle a été créé sur un thread différent de celui du thread appelant (indiquant que vous devez effectuer des appels au contrôle par le biais d’une méthode d’appel) ; 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 autre thread, vous devez utiliser l’une des méthodes d’appel du contrôle pour marshaler l’appel vers le thread approprié. Cette propriété peut être utilisée pour déterminer si vous devez appeler une méthode d’appel, ce qui peut être utile si vous ne savez pas quel thread possède un contrôle.
Note
En plus de la InvokeRequired propriété, il existe quatre méthodes sur un contrôle qui sont thread safe à appeler : Invoke,BeginInvokeEndInvoke et CreateGraphics si le handle du 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 illégaux. 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 autre thread.
Si le handle du contrôle n’existe pas encore, InvokeRequired recherche la chaîne parente du contrôle jusqu’à ce qu’il trouve un contrôle ou un formulaire qui possède un handle de fenêtre. Si aucun handle approprié n’est trouvé, la InvokeRequired méthode retourne false.
Cela signifie que cela InvokeRequired peut retourner false s’il Invoke n’est pas nécessaire (l’appel se produit sur le même thread) ou si le contrôle a été créé sur un autre thread, 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, en isolant le contrôle sur un thread sans pompe de message et en rendant l’application instable.
Vous pouvez vous protéger contre ce cas en vérifiant également la valeur du moment où IsHandleCreated elle InvokeRequired est retournée 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 de l’application (comme dans Application.Run(new MainForm()), avant l’affichage ou Application.Run l’appel du formulaire.
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 démarre le Load processus en arrière-plan.
Une solution encore meilleure consiste à utiliser le retour par SynchronizationContext plutôt qu’un contrôle pour le SynchronizationContext marshaling entre threads.
Note
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 multithreads, consultez How to : Use a Background Thread to Search for Files and How to : Make Thread-Safe Calls to Windows Forms Controls.