Control.InvokeRequired Egenskap

Definition

Hämtar ett värde som anger om anroparen måste anropa en anropande metod när metoden anropas till kontrollen eftersom anroparen finns i en annan tråd än den som kontrollen skapades på.

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

Egenskapsvärde

trueom kontrollen har skapats Handle i en annan tråd än den anropande tråden (som anger att du måste göra anrop till kontrollen via en anropande metod), annars . false

Implementeringar

Attribut

Kommentarer

Kontroller i Windows Forms är bundna till en specifik tråd och är inte trådsäkra. Om du anropar en kontrollmetod från en annan tråd måste du därför använda någon av kontrollens anropande metoder för att konvertera anropet till rätt tråd. Den här egenskapen kan användas för att avgöra om du måste anropa en anropa-metod, vilket kan vara användbart om du inte vet vilken tråd som äger en kontroll.

Note

Förutom egenskapen InvokeRequired finns det fyra metoder på en kontroll som är trådsäker att anropa: Invoke,BeginInvoke, EndInvoke och CreateGraphics om handtaget för kontrollen redan har skapats. Att anropa CreateGraphics innan kontrollens handtag har skapats i en bakgrundstråd kan orsaka olagliga korstrådsanrop. För alla andra metodanrop bör du använda någon av dessa anropande metoder när du anropar från en annan tråd.

Om kontrollens handtag ännu inte finns InvokeRequired söker du upp kontrollens överordnade kedja tills den hittar en kontroll eller ett formulär som har ett fönsterhandtag. Om det inte går att hitta InvokeRequired något lämpligt handtag returnerar falsemetoden .

Det innebär att InvokeRequired kan returnera false om Invoke det inte krävs (anropet sker i samma tråd), eller om kontrollen skapades på en annan tråd men kontrollens handtag ännu inte har skapats.

Om kontrollens handtag ännu inte har skapats bör du inte bara anropa egenskaper, metoder eller händelser på kontrollen. Detta kan göra att kontrollens handtag skapas i bakgrundstråden, isolerar kontrollen på en tråd utan en meddelandepump och gör programmet instabilt.

Du kan skydda dig mot det här fallet genom att även kontrollera värdet IsHandleCreated för när InvokeRequired returneras false i en bakgrundstråd. Om kontrollhandtaget ännu inte har skapats måste du vänta tills det har skapats innan du anropar Invoke eller BeginInvoke. Detta inträffar vanligtvis bara om en bakgrundstråd skapas i konstruktorn för det primära formuläret för programmet (som i Application.Run(new MainForm()), innan formuläret har visats eller Application.Run har anropats.

En lösning är att vänta tills formulärets handtag har skapats innan du startar bakgrundstråden. Framtvinga skapande av handtag genom att anropa Handle egenskapen eller vänta tills Load händelsen startar bakgrundsprocessen.

En ännu bättre lösning är att använda den SynchronizationContext som returneras av SynchronizationContext i stället för en kontroll för korstrådsmarshantering.

Note

Ett undantag kan uppstå om tråden som ska bearbeta meddelandet inte längre är aktiv.

Mer information om flertrådade Windows Forms kontroller finns i How to: Use a Background Thread to Search for Files and How to: Make Thread-Safe Calls to Windows Forms Controls.

Gäller för

Se även