Control.InvokeRequired Proprietà
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ottiene un valore che indica se il chiamante deve chiamare un metodo invoke durante l'esecuzione di chiamate al controllo perché il chiamante 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 il controllo Handle è stato creato in un thread diverso rispetto al thread chiamante (a indicare che è necessario effettuare chiamate al controllo tramite un metodo invoke); in caso contrario, false.
Implementazioni
- Attributi
Commenti
I controlli in Windows Form 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 utilizzare uno dei metodi invoke del controllo per effettuare il marshalling della chiamata al thread appropriato. 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.
Annotazioni
Oltre alla InvokeRequired proprietà, sono disponibili quattro metodi su un controllo thread-safe da chiamare: Invoke,BeginInvokeEndInvoke e CreateGraphics se l'handle per il controllo è già stato creato. La chiamata CreateGraphics prima che l'handle del controllo sia stato creato 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 invoke durante la chiamata da un thread diverso.
Se l'handle del controllo non esiste ancora, InvokeRequired cerca nella catena padre del controllo fino a trovare un controllo o un modulo con 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 nel controllo. Ciò potrebbe causare la creazione dell'handle del controllo nel thread in background, isolando il controllo su 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 che sia stato creato prima di chiamare Invoke o BeginInvoke. In genere, ciò si verifica 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 che l'evento Load avvii il processo in background.
Una soluzione ancora migliore consiste nell'usare l'oggetto SynchronizationContext restituito da SynchronizationContext anziché un controllo per il marshalling tra thread.
Annotazioni
È possibile che venga generata un'eccezione se il thread che deve elaborare il messaggio non è più attivo.
Per altre informazioni sui controlli Windows Form multithreading, vedere Procedura: Utilizzare un thread in background per la ricerca di file e Procedura: Effettuare chiamate Thread-Safe ai controlli Windows Form.