Control.InvokeRequired Właściwość

Definicja

Pobiera wartość wskazującą, czy obiekt wywołujący musi wywołać metodę Invoke podczas wykonywania wywołań metody do kontrolki, ponieważ obiekt wywołujący znajduje się w innym wątku niż ten, w którym został utworzony.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; }
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean

Wartość właściwości

true, jeśli Handle formantu został utworzony w innym wątku niż wątek wywołujący (wskazujący, że musisz wykonać wywołania kontrolki za pomocą metody Invoke); w przeciwnym razie 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

Atrybuty

Uwagi

Kontrolki w Windows Forms są powiązane z określonym wątkiem i nie są bezpieczne wątkowo.Controls in Windows Forms are bound to a specific thread and are not thread safe. W związku z tym, jeśli wywołujesz metodę formantu z innego wątku, musisz użyć jednej z metod wywołania kontrolki do skierowania wywołania do właściwego wątku.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. Ta właściwość może służyć do określenia, czy należy wywołać metodę Invoke, która może być przydatna, jeśli nie wiesz, który wątek jest właścicielem formantu.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.

Uwaga

Oprócz właściwości InvokeRequired istnieją cztery metody kontrolki, które są bezpieczne do wywołania: Invoke,BeginInvoke, EndInvoke i CreateGraphics, jeśli uchwyt dla kontrolki został już utworzony.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. Wywoływanie CreateGraphics przed utworzeniem uchwytu kontrolki w wątku w tle może spowodować niedozwolone wywołania międzywątkowe.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Dla wszystkich innych wywołań metody należy użyć jednej z tych metod wywołania podczas wywoływania z innego wątku.For all other method calls, you should use one of these invoke methods when calling from a different thread.

Jeśli dojście kontrolki jeszcze nie istnieje, InvokeRequired przeszukuje łańcuch nadrzędny kontrolki do momentu znalezienia formantu lub formularza, który ma uchwyt 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. Jeśli nie można znaleźć odpowiedniego dojścia, Metoda InvokeRequired zwraca false.If no appropriate handle can be found, the InvokeRequired method returns false.

Oznacza to, że InvokeRequired może zwrócić false, jeśli Invoke nie jest wymagana (wywołanie odbywa się w tym samym wątku) lub jeśli formant został utworzony w innym wątku, ale Uchwyt kontrolki nie został jeszcze utworzony.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.

W przypadku, gdy uchwyt kontrolki nie został jeszcze utworzony, nie należy po prostu wywoływać właściwości, metod ani zdarzeń w formancie.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. Może to spowodować utworzenie uchwytu kontrolki w wątku w tle, odizolowanie formantu od wątku bez pompki komunikatów i niestabilne działanie aplikacji.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.

W tym przypadku można chronić się przed tym przypadkiem, sprawdzając wartość IsHandleCreated, gdy InvokeRequired zwróci false w wątku w tle.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Jeśli uchwyt kontroli nie został jeszcze utworzony, przed wywołaniem Invoke lub BeginInvokenależy zaczekać, aż zostanie on utworzony.If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. Zwykle zdarza się to tylko wtedy, gdy wątek w tle jest tworzony w Konstruktorze formularza podstawowego dla aplikacji (jak w Application.Run(new MainForm()), przed wyświetleniem formularza lub Application.Run.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.

Jednym z rozwiązań jest oczekiwanie na utworzenie uchwytu formularza przed rozpoczęciem wątku w tle.One solution is to wait until the form's handle has been created before starting the background thread. Wymuś tworzenie uchwytów, wywołując Właściwość Handle lub poczekaj, aż zdarzenie Load rozpocznie proces w tle.Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

Jeszcze lepszym rozwiązaniem jest użycie SynchronizationContext zwrócone przez SynchronizationContext, a nie kontrolka do organizowania między wątkami.An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

Uwaga

Wyjątek może być zgłaszany, jeśli wątek, który powinien przetworzyć komunikat, nie jest już aktywny.An exception might be thrown if the thread that should process the message is no longer active.

Aby uzyskać więcej informacji o wielowątkowych kontrolkach Windows Forms, zobacz How to: Use the background Thread to Search for Files i How to: umożliwianie wywołań bezpiecznych wątków do Windows Forms formantów.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.

Dotyczy

Zobacz też