Condividi tramite


Control.InvokeRequired Proprietà

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.

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

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.

Implementazioni

Attributi

Commenti

I controlli in Windows Forms sono associati a un thread specifico e non sono thread safe. Pertanto, se si chiama il metodo di un controllo da un thread diverso, è necessario usare uno dei metodi invoke del controllo per eseguire il marshalling della chiamata al thread appropriato. Questa proprietà può essere usata per determinare se è necessario chiamare un metodo invoke, che può essere utile se non si conosce il thread proprietario di un controllo.

Nota

Oltre alla InvokeRequired proprietà, sono disponibili quattro metodi su un controllo che sono thread safe da chiamare: Invoke,BeginInvokeEndInvokee CreateGraphics se l'handle per il controllo è già stato creato. La chiamata CreateGraphics prima della creazione dell'handle del controllo in un thread in background può causare chiamate tra thread non valide. Per tutte le altre chiamate di metodo, è consigliabile usare uno di questi metodi di richiamo quando si chiama da un thread diverso.

Se l'handle del controllo non esiste ancora, InvokeRequired cerca la catena padre del controllo fino a quando non trova un controllo o una maschera che dispone di un handle di finestra. Se non è possibile trovare alcun handle appropriato, il InvokeRequired metodo restituisce false.

Ciò significa che InvokeRequired può restituire false se Invoke non è necessario (la chiamata si verifica nello stesso thread) o se il controllo è stato creato in un thread diverso, ma l'handle del controllo non è ancora stato creato.

Nel caso in cui l'handle del controllo non sia ancora stato creato, non è necessario chiamare semplicemente proprietà, metodi o eventi sul controllo. Ciò potrebbe causare la creazione dell'handle del controllo nel thread in background, isolando il controllo in un thread senza una pompa di messaggi e rendendo l'applicazione instabile.

È possibile proteggersi da questo caso controllando anche il valore di IsHandleCreated quando InvokeRequired viene restituito false in un thread in background. Se l'handle di controllo non è ancora stato creato, è necessario attendere fino a quando non è stato creato prima di chiamare Invoke o BeginInvoke. In genere, questo accade solo se un thread in background viene creato nel costruttore del modulo primario per l'applicazione (come in Application.Run(new MainForm()), prima che il modulo sia stato visualizzato o Application.Run è stato chiamato.

Una soluzione consiste nell'attendere che l'handle del modulo sia stato creato prima di avviare il thread in background. Forzare la creazione dell'handle chiamando la Handle proprietà o attendere l'avvio del processo in background dell'evento Load .

Una soluzione ancora migliore consiste nell'usare il restituito da SynchronizationContext anziché un controllo per il SynchronizationContext marshalling tra thread.

Nota

Un'eccezione potrebbe essere generata se il thread che deve elaborare il messaggio non è più attivo.

Per altre informazioni sui controlli Windows Forms multithreading, vedere Procedura: Usare un thread in background per cercare file e Procedura: Effettuare chiamate Thread-Safe ai controlli Windows Forms.

Si applica a

Vedi anche