Control.InvokeRequired Vlastnost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Získá hodnotu určující, zda volající musí volat vyvolání metody při volání metody ovládacího prvku, protože volající je v jiném vlákně než ten, na který byl vytvořen ovládací prvek.
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
Hodnota vlastnosti
true Pokud byl ovládací prvek Handle vytvořen v jiném vlákně než volající vlákno (označující, že musíte provést volání ovládacího prvku prostřednictvím metody vyvolání); jinak , false.
Implementuje
- Atributy
Poznámky
Ovládací prvky ve Windows Forms jsou svázané s určitým vláknem a nejsou bezpečné pro přístup z více vláken. Proto pokud voláte metodu ovládacího prvku z jiného vlákna, musíte použít jednu z metod vyvolání ovládacího prvku k zařazování volání do správného vlákna. Tuto vlastnost lze použít k určení, zda je nutné volat metodu vyvolání, což může být užitečné, pokud nevíte, které vlákno vlastní ovládací prvek.
Poznámka:
Kromě InvokeRequired vlastnosti existují čtyři metody ovládacího prvku, které jsou bezpečné pro volání vlákna: InvokeBeginInvoke, EndInvoke a CreateGraphics pokud popisovač pro ovládací prvek již byl vytvořen. Volání CreateGraphics před vytvořením popisovače ovládacího prvku ve vlákně na pozadí může způsobit nelegální volání mezi vlákny. Pro všechna ostatní volání metod byste měli použít jednu z těchto metod vyvolání při volání z jiného vlákna.
Pokud popisovač ovládacího prvku ještě neexistuje, vyhledá nadřazený řetězec ovládacího prvku, InvokeRequired dokud nenajde ovládací prvek nebo formulář, který má úchyt okna. Pokud nelze najít žádný vhodný popisovač, InvokeRequired metoda vrátí false.
To znamená, že se InvokeRequired může vrátit false , pokud Invoke není požadováno (volání probíhá ve stejném vlákně), nebo pokud byl ovládací prvek vytvořen v jiném vlákně, ale popisovač ovládacího prvku ještě nebyl vytvořen.
V případě, že popisovač ovládacího prvku ještě nebyl vytvořen, byste neměli jednoduše volat vlastnosti, metody nebo události ovládacího prvku. To může způsobit vytvoření popisovače ovládacího prvku ve vlákně na pozadí, izolování ovládacího prvku na vlákně bez pumpy zpráv a vytvoření nestabilní aplikace.
Proti tomuto případu můžete chránit také tak, že zkontrolujete hodnotu IsHandleCreated , kdy InvokeRequired se vrátí false ve vlákně na pozadí. Pokud ovládací úchyt ještě nebyl vytvořen, musíte před voláním nebo BeginInvokevoláním Invoke počkat na jeho vytvoření. K tomu obvykle dochází pouze v případě, že je v konstruktoru primárního formuláře pro aplikaci vytvořen vlákno na pozadí (jako v Application.Run(new MainForm()), dříve, než byl formulář zobrazen nebo Application.Run byl volán.
Jedním z řešení je počkat, než se vytvoří popisovač formuláře před spuštěním vlákna na pozadí. Buď vynuťte vytvoření voláním Handle vlastnosti, nebo počkejte, až Load událost spustí proces na pozadí.
Ještě lepším řešením je použít SynchronizationContext vrácené místo ovládacího prvku pro zařazování mezi vlákny SynchronizationContext .
Poznámka:
Pokud vlákno, které by mělo zprávu zpracovat, již není aktivní, může být vyvolán výjimka.
Další informace o vícevláknových ovládacích prvcích Windows Forms naleznete v tématu Postupy: Použití vlákna pozadí k hledání souborů a postupy: Provádění Thread-Safe volání ovládacích prvků Windows Forms.