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ż 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 falsewartość .

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.

Dotyczy

Zobacz też