Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 22231|Svar: 0

[Kommunikation] .net/c# SynchronizationContext for detaljer

[Kopier link]
Opslået på 15/03/2018 11.51.07 | | | |
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:







Tidligere:Syvogfyrre måder at optimere et C#-program på
Næste:.net/c# Shanghai Pai Shanghai Brand Assistant [med kildekode]
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com