Udostępnij za pośrednictwem


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ż ta, w której została utworzona kontrolka.

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

Wartość właściwości

true jeśli kontrolka Handle została utworzona w innym wątku niż wątek wywołujący (wskazujący, że należy wykonać wywołania kontrolki za pomocą metody invoke); w przeciwnym razie false.

Implementuje

Atrybuty

Uwagi

Kontrolki w formularzach systemu Windows są powiązane z określonym wątkiem i nie są bezpieczne wątkowo. W związku z tym, jeśli wywołujesz metodę kontrolki z innego wątku, musisz użyć jednej z metod wywołania kontrolki do marshalingu wywołania do odpowiedniego wątku. Tej właściwości można użyć do określenia, czy należy wywołać metodę invoke, co może być przydatne, jeśli nie wiesz, jaki wątek jest właścicielem kontrolki.

Uwaga / Notatka

Oprócz InvokeRequired właściwości istnieją cztery metody kontrolki, które są bezpieczne wątkiem do wywołania: Invoke,BeginInvokeEndInvoke i CreateGraphics jeśli uchwyt dla kontrolki został już utworzony. Wywołanie wywołania CreateGraphics przed utworzeniem uchwytu kontrolki w wątku w tle może spowodować nielegalne wywołania między wątkami. W przypadku wszystkich innych wywołań metod należy użyć jednej z tych metod wywoływania podczas wywoływania z innego wątku.

Jeśli uchwyt kontrolki jeszcze nie istnieje, InvokeRequired przeszukuje łańcuch nadrzędny kontrolki, dopóki nie znajdzie kontrolki lub formularza, który ma uchwyt okna. Jeśli nie można odnaleźć odpowiedniego uchwytu InvokeRequired , metoda zwraca falsewartość .

Oznacza to, że InvokeRequired może zostać zwrócony false , jeśli Invoke nie jest wymagane (wywołanie występuje w tym samym wątku) lub jeśli kontrolka została utworzona w innym wątku, ale uchwyt kontrolki nie został jeszcze utworzony.

W przypadku, gdy uchwyt kontrolki nie został jeszcze utworzony, nie należy po prostu wywoływać właściwości, metody lub zdarzenia w kontrolce. Może to spowodować utworzenie uchwytu kontrolki w wątku w tle, izolowanie kontrolki w wątku bez pompy komunikatów i niestabilnie aplikacji.

Możesz chronić się przed tym przypadkiem, sprawdzając również wartość IsHandleCreated wartości po InvokeRequired powrocie false w wątku w tle. Jeśli uchwyt sterowania nie został jeszcze utworzony, musisz poczekać, aż zostanie utworzony przed wywołaniem Invoke metody lub BeginInvoke. Zazwyczaj dzieje się tak tylko wtedy, gdy w konstruktorze formularza podstawowego aplikacji jest tworzony wątek w tle (tak jak w Application.Run(new MainForm())pliku , zanim formularz został wyświetlony lub Application.Run został wywołany.

Jednym z rozwiązań jest oczekiwanie na utworzenie dojścia formularza przed uruchomieniem wątku w tle. Wymuś utworzenie dojścia przez wywołanie Handle właściwości lub poczekaj, aż Load zdarzenie rozpocznie proces w tle.

Jeszcze lepszym rozwiązaniem jest użycie SynchronizationContext zwracanego elementu, SynchronizationContext a nie kontrolki do marshalingu międzywątkowego.

Uwaga / Notatka

Wyjątek może zostać zgłoszony, jeśli wątek, który powinien przetworzyć komunikat, nie jest już aktywny.

Aby uzyskać więcej informacji na temat wielowątkowych kontrolek formularzy systemu Windows, zobacz Instrukcje: używanie wątku w tle do wyszukiwania plików i Instrukcje: tworzenie wywołań Thread-Safe do kontrolek formularzy systemu Windows.

Dotyczy

Zobacz też