Control.InvokeRequired Tulajdonság
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Egy értéket kap, amely jelzi, hogy a hívónak meghívnia kell-e egy meghívási metódust a vezérlőhöz való metódushívások során, mert a hívó más szálon van, mint amelyiken a vezérlő létre lett hozva.
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
Tulajdonság értéke
true ha a vezérlő Handle a hívó száltól eltérő szálon lett létrehozva (ami azt jelzi, hogy hívási módszerrel kell meghívnia a vezérlőt); ellenkező esetben false.
Megvalósítás
- Attribútumok
Megjegyzések
A Windows Forms vezérlői egy adott szálhoz vannak kötve, és nem biztonságosak. Ezért ha egy vezérlő metódusát egy másik szálról hívja meg, a vezérlő egyik meghívási metódusával kell a megfelelő szálra irányítani a hívást. Ezzel a tulajdonságdal megállapíthatja, hogy meghívni kell-e egy meghívási metódust, ami akkor lehet hasznos, ha nem tudja, hogy melyik szálhoz tartozik vezérlő.
Note
A tulajdonságon kívül InvokeRequired négy metódus is található egy olyan vezérlőn, amely biztonságosan hívható: Invoke,BeginInvoke, EndInvoke és CreateGraphics ha a vezérlő leírója már létrejött. A háttérszálon a vezérlő leírójának létrehozása előtt történő hívás CreateGraphics illegális szálközi hívásokat okozhat. Az összes többi metódushíváshoz az alábbi meghívási metódusok egyikét kell használnia egy másik szálról való híváskor.
Ha a vezérlő fogópontja még nem létezik, keresse meg a vezérlő szülőláncát, InvokeRequired amíg nem talál egy olyan vezérlőt vagy űrlapot, amely rendelkezik ablakfogópontpal. Ha nem található megfelelő fogópont, a InvokeRequired metódus ad vissza false.
Ez azt jelenti, hogy InvokeRequired vissza tud térni false , ha Invoke nem szükséges (a hívás ugyanazon a szálon történik), vagy ha a vezérlő egy másik szálon lett létrehozva, de a vezérlő leírója még nem lett létrehozva.
Abban az esetben, ha a vezérlő leírója még nem lett létrehozva, nem szabad egyszerűen tulajdonságokat, metódusokat vagy eseményeket meghívnia a vezérlőn. Ez azt okozhatja, hogy a vezérlő fogópontja létrejön a háttérszálon, el van különítve a vezérlőt egy szálon üzenetszivattyú nélkül, és instabillá teheti az alkalmazást.
Ezzel az esettel szemben úgy is védekezhet, hogy ellenőrzi, hogy mikor IsHandleCreatedInvokeRequired tér vissza false egy háttérszál. Ha a vezérlőfogópont még nem lett létrehozva, meg kell várnia, amíg létrejött a hívás vagy Invokea hívás BeginInvoke előtt. Ez általában csak akkor fordul elő, ha az alkalmazás elsődleges űrlapjának konstruktorában létrejön egy háttérszál (ahogyan Application.Run(new MainForm())az űrlap megjelenítése vagy Application.Run meghívása előtt).
Az egyik megoldás az, hogy megvárja, amíg az űrlap leírója létre nem jön, mielőtt elindítja a háttérszálat. Vagy kényszerítse a létrehozást a Handle tulajdonság meghívásával, vagy várja meg, amíg az Load esemény elindítja a háttérfolyamatot.
Még jobb megoldás, ha a visszaadott SynchronizationContext értékeket használja a SynchronizationContext szálkeresztezés vezérlése helyett.
Note
Kivétel akkor fordulhat elő, ha az üzenetet feldolgozó szál már nem aktív.
A többszálas Windows Forms vezérlőkkel kapcsolatos további információkért lásd: Hogyan is: Háttérszál használata fájlok kereséséhez és Hogyan is: Thread-Safe hívásokat kezdeményezhet Windows Forms vezérlőkhöz.