Control.InvokeRequired Właściwość
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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 ramach którego utworzono kontrolkę.
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ąc, że należy wykonać wywołania kontrolki za pomocą metody invoke); w przeciwnym razie false
.
Implementuje
- Atrybuty
Uwagi
Kontrolki w Windows Forms są powiązane z określonym wątkiem i nie są bezpieczne wątkiem. 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, która może być przydatna, jeśli nie wiesz, jaki wątek jest właścicielem kontrolki.
Uwaga
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 przed CreateGraphics utworzeniem uchwytu kontrolki w wątku w tle może spowodować nielegalne wywołania między wątkami. W przypadku wszystkich innych wywołań metody należy użyć jednej z tych metod wywołań 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 false
wartość .
Oznacza to, że InvokeRequired może zwrócić 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, odizolowanie kontrolki od wątku bez pompy komunikatów i niestabilne aplikacji.
Można chronić przed tym przypadkiem, sprawdzając również wartość w przypadku InvokeRequired powrotu IsHandleCreatedfalse
w wątku w tle. Jeśli nie utworzono jeszcze uchwytu sterującego, musisz poczekać na jego utworzenie przed wywołaniem Invoke lub BeginInvoke. Zazwyczaj dzieje się tak tylko wtedy, gdy w konstruktorze formularza podstawowego aplikacji jest tworzony wątek w tle (tak jak w pliku , Application.Run(new MainForm())
zanim formularz został wyświetlony lub Application.Run
został wywołany.
Jednym z rozwiązań jest oczekiwanie na utworzenie uchwytu formularza przed uruchomieniem wątku w tle. Wymuś utworzenie uchwytu Handle przez wywołanie właściwości lub zaczekaj na Load uruchomienie procesu w tle.
Jeszcze lepszym rozwiązaniem jest użycie SynchronizationContext
zwracanego elementu SynchronizationContext zamiast kontrolki do marshalingu międzywątkowego.
Uwaga
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 kontrolek Windows Forms wielowątkowych, zobacz Instrukcje: używanie wątku w tle do wyszukiwania plików i instrukcje: tworzenie wywołań Thread-Safe do kontrolek Windows Forms.