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:
|