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 označující, zda volající musí volat metodu 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 (což znamená, že je nutné provést volání ovládacího prvku pomocí metody vyvolání), v opačném případě false
.
Implementuje
- Atributy
Poznámky
Ovládací prvky v model Windows Forms jsou vázané na určité vlákno 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 vyvolávací metodu, což může být užitečné, pokud nevíte, které vlákno vlastní ovládací prvek.
Poznámka
Kromě InvokeRequired vlastnosti existují u ovládacího prvku čtyři metody, které lze volat bezpečně z více vláken: Invoke,BeginInvokeEndInvoke a CreateGraphics pokud je popisovač ovládacího prvku již 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 neplatná 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, InvokeRequired vyhledá nadřazený řetězec ovládacího prvku, dokud nenajde ovládací prvek nebo formulář, který má popisovač okna. Pokud se nenajde vhodný popisovač, InvokeRequired vrátí false
metoda .
To znamená, že se může vrátitfalse
, InvokeRequired pokud Invoke není vyžadován (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 ve vlákně bez čerpadla zpráv a způsobit nestabilitu aplikace.
Proti tomuto případu můžete chránit také kontrolou hodnoty IsHandleCreated při InvokeRequired vrácení false
ve vlákně na pozadí. Pokud popisovač ovládacího prvku ještě nebyl vytvořen, musíte před voláním Invoke příkazu nebo BeginInvokepočkat na jeho vytvoření. Obvykle k tomu dochází pouze v případě, že je vlákno na pozadí vytvořeno v konstruktoru primárního formuláře pro aplikaci (například před Application.Run(new MainForm())
zobrazením nebo Application.Run
zavolám formuláře).
Jedním z řešení je počkat, než se vytvoří popisovač formuláře, a teprve potom spustit vlákno na pozadí. Vynuťte vytvoření zpracování voláním Handle vlastnosti nebo počkejte, až Load událost spustí proces na pozadí.
Ještě lepším řešením je místo ovládacího prvku pro zařazování mezi vlákny použít SynchronizationContext
vrácené SynchronizationContext metodou .
Poznámka
Pokud vlákno, které by mělo zprávu zpracovat, už není aktivní, může dojít k výjimce.
Další informace o ovládacích prvcích model Windows Forms s více vlákny najdete v tématech Postupy: Použití vlákna na pozadí k vyhledávání souborů a Postupy: Volání Thread-Safe ovládacích prvků model Windows Forms.