Control.InvokeRequired Control.InvokeRequired Control.InvokeRequired Control.InvokeRequired Property

Definizione

Ottiene un valore che indica se il chiamante deve usare un metodo Invoke per eseguire chiamate di metodo al controllo, in quanto si trova in un thread diverso da quello in cui è stato creato il controllo.Gets a value indicating whether the caller must call an invoke method when making method calls to the control because the caller is on a different thread than the one the control was created on.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean

Valore della proprietà

true se l'oggetto Handle del controllo è stato creato in un thread diverso da quello del chiamante, ovvero è necessario effettuare chiamate al controllo tramite un metodo Invoke; in caso contrario, false.true if the control's Handle was created on a different thread than the calling thread (indicating that you must make calls to the control through an invoke method); otherwise, false.

Implementazioni

Commenti

I controlli in Windows Form sono associati a un thread specifico e non sono thread-safe.Controls in Windows Forms are bound to a specific thread and are not thread safe. Pertanto, se si chiama un metodo di controllo da un thread diverso, è necessario utilizzare uno dei metodi per il marshalling della chiamata al thread appropriato invoke del controllo.Therefore, if you are calling a control's method from a different thread, you must use one of the control's invoke methods to marshal the call to the proper thread. Questa proprietà può essere utilizzata per determinare se è necessario chiamare un metodo invoke, che può essere utile se non si conosce il thread proprietario di un controllo.This property can be used to determine if you must call an invoke method, which can be useful if you do not know what thread owns a control.

Nota

Oltre al InvokeRequired proprietà, sono disponibili quattro metodi su un controllo che sono thread-safe chiamare: Invoke,BeginInvoke, EndInvoke e CreateGraphics se l'handle per il controllo è già stato creato.In addition to the InvokeRequired property, there are four methods on a control that are thread safe to call: Invoke,BeginInvoke, EndInvoke and CreateGraphics if the handle for the control has already been created. La chiamata a CreateGraphics prima che venga creato l'handle del controllo in un thread in background può causare valido chiamate tra thread.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Per tutte le altre chiamate al metodo, è consigliabile usare uno di questi richiamare i metodi quando viene chiamato da un thread diverso.For all other method calls, you should use one of these invoke methods when calling from a different thread.

Se l'handle del controllo non esiste ancora, InvokeRequired Cerca catena padre del controllo finché non trova un controllo o form che dispone di un handle di finestra.If the control's handle does not yet exist, InvokeRequired searches up the control's parent chain until it finds a control or form that does have a window handle. Se non viene trovato alcun handle appropriato, il InvokeRequired restituzione del metodo false.If no appropriate handle can be found, the InvokeRequired method returns false.

Ciò significa che InvokeRequired può restituire false se Invoke non è obbligatorio (la chiamata si verifica nello stesso thread), oppure se il controllo è stato creato in un thread diverso, ma non è ancora stato creato l'handle del controllo.This means that InvokeRequired can return false if Invoke is not required (the call occurs on the same thread), or if the control was created on a different thread but the control's handle has not yet been created.

Nel caso in cui l'handle del controllo non è ancora stato creato, è necessario non è sufficiente chiamare le proprietà, metodi o eventi sul controllo.In the case where the control's handle has not yet been created, you should not simply call properties, methods, or events on the control. Ciò potrebbe causare l'handle del controllo da creare sul thread in background, isolando il controllo su un thread senza un message pump e rendere instabile l'applicazione.This might cause the control's handle to be created on the background thread, isolating the control on a thread without a message pump and making the application unstable.

Permette di proteggersi da questo caso, controllare anche il valore di IsHandleCreated quando si InvokeRequired restituisce false su un thread in background.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Se non è ancora stato creato l'handle del controllo, è necessario attendere che è stato creato prima di chiamare Invoke o BeginInvoke.If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. In genere, ciò si verifica solo se viene creato un thread in background nel costruttore del form principale dell'applicazione (come in Application.Run(new MainForm()), prima che sia stato visualizzato il form o Application.Run è stato chiamato.Typically, this happens only if a background thread is created in the constructor of the primary form for the application (as in Application.Run(new MainForm()), before the form has been shown or Application.Run has been called.

Una soluzione è in attesa finché l'handle del modulo è stato creato prima di avviare il thread in background.One solution is to wait until the form's handle has been created before starting the background thread. È possibile imporre la creazione dell'handle chiamando il Handle proprietà, o attendere fino al Load evento per avviare il processo in background.Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

Una soluzione ancora migliore consiste nell'usare la SynchronizationContext restituito da SynchronizationContext invece di un controllo per il marshalling cross-thread.An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

Nota

Potrebbe essere generata un'eccezione se il thread che debba elaborare il messaggio non è più attivo.An exception might be thrown if the thread that should process the message is no longer active.

Per altre informazioni sui controlli Windows Form multithreading, vedere come: Usare un Thread in Background per la ricerca di file e come: Effettuare chiamate Thread-Safe a controlli di Windows Form.For more information about multithreaded Windows Forms controls, see How to: Use a Background Thread to Search for Files and How to: Make Thread-Safe Calls to Windows Forms Controls.

Si applica a

Vedi anche