Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 22231|Atsakyti: 0

[Komunikatas] .net/c# SynchronizationContext išsamesnės informacijos

[Kopijuoti nuorodą]
Paskelbta 2018-03-15 11:51:07 | | | |
Aš perskaičiau daug įvadinių straipsnių apie tai, kaip atnaujinti pagrindinę sąsają fone gija, ir dauguma jų naudoja Control.Invoke ir Control.BeginInvoke. Tai geri sprendimai, tačiau yra dvi problemos:

1. Turite nurodyti System.Windows.Forms, tada naudoti System.Windows.Forms

2. Kodo struktūra yra gana netvarkinga. (Tiesą sakant, tai taip pat sukelia # 1)

"Microsoft" siūlo dar vieną elegantiškesnį sprendimą – "System.Threading". Sinchronizavimo kontekstas。 Kaip matote, jo nėra namesapce System.Windows.Forms, todėl galime teisėtai jį naudoti "BusinessLaryer", "Controler" ir net moduliuose.

Ir tai labai patogu naudoti, jums reikia sutelkti dėmesį tik į šiuos du metodus:

1. Siųsti: siunčia sąsajos atnaujinimo užklausą į pagrindinę giją, blokuodama dabartinę giją, kol ji grįš.

2. Skelbti: siunčia sąsajos atnaujinimo užklausą į pagrindinę giją, neužblokuodamas dabartinės gijos.

Tiesą sakant, jie visi yra tas pats metodas, išskyrus tai, kad siuntimas yra sinchroninis, o paštas yra asinchroninis


Prieš Form1 form = new Form1(), objektas SynchronizationContext buvo tuščias, o sukūrus formą Form1, objektas SynchronizationContext buvo pridėtas prie šios gijos. Taigi atsakymas yra toks, kad sukūrus objektą Control, objektas SynchronizationContext taip pat sukuriamas ir pridedamas prie gijos. Viskas naudojant formą InitializeComponent(); Kai tai bus padaryta, jis gali gauti objektą, kuris nėra NULL


Galiausiai, skirtumas tarp SynchronizationContext metodų Sendt() ir Post():

Send() įgyvendinamas tiesiog iškviečiant dabartinės gijos atstovą (sinchroninis skambutis). Tai reiškia, kad vartotojo sąsajos gija tiesiogiai iškviečiama vykdyti antrinę giją, o antrinė gija bus vykdoma baigus vartotojo sąsajos gijos vykdymą.

Post() įgyvendinamas iškviečiant atstovą gijų telkinyje (asinchroninis iškvietimas). Taip yra todėl, kad antrinė gija suras giją iš gijų telkinio, kad sureguliuotų vartotojo sąsajos giją, o pogija tiesiogiai vykdys savo kodą, nelaukdama, kol vartotojo sąsajos gija bus baigta.
Bandymo kodas:

Rezultatus:

Vartotojo sąsajos pagrindinė gija: 1
Sriegis: 5
Sinchronizavimo kontekstas:1


Suvestinė:Vartotojo sąsajos gijos objektas SynchronizationContext, nesvarbu, ar jis iškviečiamas pagrindinėje gijoje, ar gijoje, bus vykdomas pagrindinėje gijoje, todėl, kai yra daug laiko reikalaujančio kodo, vartotojo sąsajos sąsaja užšals arba suklastos mirtis

Tiesą sakantVartotojo sąsajos gija naudoja ne SynchronizationContext klasę, o WindowsFormsSynchronizationContextŠis Dongdongas.





System.Threading.SynchronizationContext šaltinio kodas:


WindowsFormsSynchronizationContext šaltinio kodas:







Ankstesnis:Keturiasdešimt septyni būdai, kaip optimizuoti C# programą
Kitą:.net/c# Šanchajaus Pai Šanchajaus prekės ženklo asistentas [su šaltinio kodu]
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com