Jeg har læst mange introduktionsartikler om, hvordan man opdaterer hovedgrænsefladen i baggrundstråden, og de fleste bruger Control.Invoke og Control.BeginInvoke. Disse er gode løsninger, men der er to problemer:
1. Du skal referere til System.Windows.Forms, og derefter bruge System.Windows.Forms
2. Kodestrukturen er relativt rodet. (Faktisk skyldes det også #1)
Microsoft tilbyder en anden mere elegant løsning, nemlig System.Threading. SynchronizationContext。 Som du kan se, er det ikke i namesapce System.Windows.Forms, så vi kan med rette bruge det i BusinessLaryer, Controler og endda moduler.
Og det er meget bekvemt at bruge, du behøver kun fokusere på følgende to metoder:
1. Send: Sender en opdateringsanmodning om interface til hovedtråden og blokerer den aktuelle tråd, indtil den returnerer.
2. Post: Sender en opdateringsanmodning om interface til hovedtråden uden at blokere den aktuelle tråd.
Faktisk er de alle den samme metode, bortset fra at send er synkron og post er asynkron
Før Form1-form = ny Form1(), var SynchronizationContext-objektet tomt, og da Form1-formen blev instansieret, blev SynchronizationContext-objektet tilføjet denne tråd. Så svaret er, at når Control-objektet oprettes, SynchronizationContext-objektet oprettes og tilknyttes også tråden. Alt dette ved brug af formen InitializeComponent(); Når dette er gjort, kan den hente et objekt, der ikke er NULL
Endelig forskellen mellem Sendt() og Post()-metoderne i SynchronizationContext:
Send() implementeres ved blot at kalde delegaten på den aktuelle tråd (synkront kald). Det vil sige, UI-tråden kaldes direkte på undertråden for at eksekvere, og subtråden fortsætter med at køre, efter at UI-tråden er færdig.
Post() implementeres ved at kalde en delegat på trådpoolen (asynkront kald). Dette skyldes, at undertråden vil finde en tråd fra trådpoolen til at tune UI-tråden, og undertråden vil direkte eksekvere sin egen kode uden at vente på, at UI-tråden bliver færdig. Testkode:
Udfald:
UI hovedtråd: 1 Tråd: 5 SynchContext:1
Resumé:Objektet SynchronizationContext på UI-tråden, uanset om det kaldes i hovedtråden eller i tråden, vil blive udført på hovedtråden, så når der er meget tidskrævende kode, vil det få UI-interfacet til at fryse eller lade som om, det dør!
FaktiskUI-tråden bruger ikke SynchronizationContext-klassen, men WindowsFormsSynchronizationContextDenne Dongdong.
System.Threading.SynchronizationContext kildekode:
WindowsFormsSynchronizationContext-kildekode:
|