Control.InvokeRequired Vlastnost

Definice

Získá hodnotu, která označuje, zda volající musí volat metodu Invoke při volání metody do ovládacího prvku, protože volající je v jiném vlákně než ten, na kterém byl ovládací prvek vytvořen.Gets a value indicating whether the caller must call an invoke method when making method calls to the control because the caller is on a different thread than the one the control was created on.

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

Boolean

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 prostřednictvím metody Invoke), jinak false .true if the control's Handle was created on a different thread than the calling thread (indicating that you must make calls to the control through an invoke method); otherwise, false.

Implementuje

Atributy

Poznámky

Ovládací prvky v model Windows Forms jsou vázány na konkrétní vlákno a nejsou bezpečné pro přístup z více vláken.Controls in Windows Forms are bound to a specific thread and are not thread safe. Proto pokud voláte metodu ovládacího prvku z jiného vlákna, je nutné použít jednu z metod vyvolání ovládacího prvku pro zařazení volání do správného vlákna.Therefore, if you are calling a control's method from a different thread, you must use one of the control's invoke methods to marshal the call to the proper thread. Pomocí této vlastnosti lze určit, zda je nutné zavolat metodu Invoke, což může být užitečné, Pokud nevíte, které vlákno vlastní ovládací prvek.This property can be used to determine if you must call an invoke method, which can be useful if you do not know what thread owns a control.

Poznámka

Kromě InvokeRequired vlastnosti existují čtyři metody v ovládacím prvku, které jsou vláknově bezpečné pro volání: Invoke , BeginInvoke EndInvoke a, CreateGraphics Pokud již byl popisovač pro ovládací prvek vytvořen.In addition to the InvokeRequired property, there are four methods on a control that are thread safe to call: Invoke,BeginInvoke, EndInvoke and CreateGraphics if the handle for the control has already been created. 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.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Pro všechna ostatní volání metod byste při volání z jiného vlákna měli použít jednu z těchto metod vyvolání.For all other method calls, you should use one of these invoke methods when calling from a different thread.

Pokud popisovač ovládacího prvku ještě neexistuje, InvokeRequired vyhledá nadřazený řetěz ovládacího prvku, dokud nenajde ovládací prvek nebo formulář, který má popisovač okna.If the control's handle does not yet exist, InvokeRequired searches up the control's parent chain until it finds a control or form that does have a window handle. Pokud se žádný odpovídající popisovač nenajde, metoda se InvokeRequired vrátí false .If no appropriate handle can be found, the InvokeRequired method returns false.

To znamená, že InvokeRequired se může vrátit, false Pokud Invoke není vyž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.This means that InvokeRequired can return false if Invoke is not required (the call occurs on the same thread), or if the control was created on a different thread but the control's handle has not yet been created.

V případě, že se popisovač ovládacího prvku ještě nevytvořil, neměli byste jednoduše volat vlastnosti, metody nebo události na ovládacím prvku.In the case where the control's handle has not yet been created, you should not simply call properties, methods, or events on the control. To může způsobit, že se popisovač ovládacího prvku vytvoří ve vlákně na pozadí a izoluje ovládací prvek v vlákně bez zprávy a tím, že aplikace nebude stabilní.This might cause the control's handle to be created on the background thread, isolating the control on a thread without a message pump and making the application unstable.

Můžete chránit před tímto případem, a to tak, že zkontrolujete hodnotu IsHandleCreated při InvokeRequired návratu false vlákna na pozadí.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Pokud ovládací prvek nebyl dosud vytvořen, je nutné počkat na jeho vytvoření před voláním Invoke nebo BeginInvoke .If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. Obvykle k tomu dochází pouze v případě, že je vytvořeno vlákno na pozadí v konstruktoru primárního formuláře aplikace (jako v Application.Run(new MainForm()) , před zobrazením nebo Application.Run voláním formuláře.Typically, this happens only if a background thread is created in the constructor of the primary form for the application (as in Application.Run(new MainForm()), before the form has been shown or Application.Run has been called.

Jedním z řešení je počkat, až bude popisovač formuláře vytvořen před spuštěním vlákna na pozadí.One solution is to wait until the form's handle has been created before starting the background thread. Vynutit vytváření popisovačů voláním Handle vlastnosti nebo počkejte, až Load událost spustí proces na pozadí.Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

Ještě lepším řešením je použití SynchronizationContext funkcí vrácených SynchronizationContext spíše než ovládací prvek pro zařazování mezi vlákny.An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

Poznámka

Výjimka může být vyvolána, pokud vlákno, které by měla zprávu zpracovat, již není aktivní.An exception might be thrown if the thread that should process the message is no longer active.

Další informace o ovládacích prvcích s více model Windows Forms vlákny naleznete v tématu How to: use the na pozadí pro hledání souborů a postupy: volání Thread-Safe pro model Windows Forms ovládací prvky.For more information about multithreaded Windows Forms controls, see How to: Use a Background Thread to Search for Files and How to: Make Thread-Safe Calls to Windows Forms Controls.

Platí pro

Viz také