Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 22231|Odgovoriti: 0

[Komunikacija] .net/c# SynchronizationContext za podrobnosti

[Kopiraj povezavo]
Objavljeno na 15. 03. 2018 11:51:07 | | | |
Prebral sem veliko uvodnih člankov o tem, kako posodobiti glavni vmesnik v ozadni niti, in večina uporablja Control.Invoke in Control.BeginInvoke. To so dobre rešitve, vendar obstajata dve težavi:

1. Morate se sklicevati na System.Windows.Forms in nato uporabiti System.Windows.Forms

2. Struktura kode je razmeroma neurejena. (Pravzaprav je to tudi posledica #1)

Microsoft ponuja še eno, bolj elegantno rešitev, in sicer System.Threading. SynchronizationContext。 Kot vidite, ni v namesapce System.Windows.Forms, zato ga lahko upravičeno uporabljamo v BusinessLaryerju, Controlerju in celo modulih.

In je zelo priročna za uporabo, osredotočiti se morate le na naslednji dve metodi:

1. Pošlji: Pošlje zahtevo za posodobitev vmesnika glavni niti in blokira trenutno nit, dokler se ne vrne.

2. Post: Pošlje zahtevo za posodobitev vmesnika glavni niti, ne da bi blokiral trenutno nit.

Pravzaprav so vse iste metode, le da je send sinhron, post pa asinhron


Pred obrazcem Form1 = novim Form1() je bil objekt SynchronizationContext prazen, in ko je bila obrazec Form1 instanciran, je bil objekt SynchronizationContext dodan tej niti. Torej, odgovor je, da ko se ustvari kontrolni objekt, objekt SynchronizationContext je prav tako ustvarjen in priključen na nit. Vse to pri uporabi oblike InitializeComponent(); Ko je to storjeno, lahko dobi objekt, ki ni NULL


Nazadnje, razlika med metodama Sendt() in Post() za SynchronizationContext:

Send() je implementiran tako, da preprosto pokličemo delegata na trenutni niti (sinhroni klic). To pomeni, da se UI nit neposredno pokliče na podnit za izvajanje, podnit pa se izvaja tudi po zaključku izvajanja UI niti.

Post() se implementira z klicem delegata v nitnem bazenu (asinhroni klic). To je zato, ker podnit najde nit iz bazena niti za nastavitev UI niti, podnit pa neposredno izvede svojo kodo brez čakanja, da se UI nit dokonča.
Testna koda:

Rezultat:

Glavna nit uporabniškega vmesnika: 1
Nit: 5
SynchContext:1


Povzetek:Objekt SynchronizationContext v UI niti, ne glede na to, ali je klican v glavni niti ali v niti, se bo izvajal na glavni niti, zato se ob preveliki zamudni kodi uporabniški vmesnik zamrzne ali ponaredi smrt

V bistvuUI nit ne uporablja razreda SynchronizationContext, ampak WindowsFormsSynchronizationContextTa Dongdong.





Izvorna koda System.Threading.SynchronizationContext:


Izvorna koda WindowsFormsSynchronizationContext:







Prejšnji:Sedeminštirideset načinov za optimizacijo programa v C#
Naslednji:.net/c# Shanghai Pai Shanghai Brand Assistant [z izvorno kodo]
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com