Olen lugenud palju sissejuhatavaid artikleid selle kohta, kuidas taustateemas peamist liidest uuendada, ja enamik neist kasutab Control.Invoke'i ja Control.BeginInvoke'i. Need on head lahendused, kuid on kaks probleemi:
1. Pead viitama System.Windows.Forms ja seejärel kasutama System.Windows.Forms
2. Koodistruktuur on suhteliselt segane. (Tegelikult on selle põhjuseks ka #1)
Microsoft pakub teist elegantsemat lahendust, nimelt System.Threadingut. SynchronizationContext。 Nagu näha, ei ole see namesapce System.Windows.Forms failis, seega saame seda õigustatult kasutada BusinessLaryeris, Controleris ja isegi moodulites.
Ja seda on väga mugav kasutada, pead keskenduma vaid järgmistele kahele meetodile:
1. Saatmine: Saadab liidese uuendustaotluse põhilõimele, blokeerides praeguse lõime kuni selle tagasitulekuni.
2. Post: Saadab liidese uuenduse päringu põhilõimele ilma praegust lõime blokeerimata.
Tegelikult on need kõik sama meetodiga, välja arvatud see, et send on sünkroonne ja post asünkroonne
Enne Form1 form = uus Form1() oli SynchronizationContext objekt tühi ning kui Form1 vorm käivitati, lisati sellele lõimele SynchronizationContext objekt. Nii et vastus on see, et kui Control-objekt luuakse, SynchronizationContext objekt luuakse ja liidetakse lõimele. Kõik siis, kui kasutatakse vormi InitializeComponent(); Kui see on tehtud, saab ta objekti, mis ei ole NULL
Lõpuks, erinevus Sendt() ja Post() meetodite vahel SynchronizationContextis:
Send() teostatakse lihtsalt praeguse lõime delegaadi kutsumisega (sünkroonne kõne). See tähendab, et kasutajaliidese lõim kutsutakse otse alamlõimele käivitamiseks ning alamlõim jätkab täitmist pärast kasutajaliidese lõime täitmise lõpetamist.
Post() rakendatakse, kutsudes lõimede basseini delegaati (asünkroonne kutse). See on sellepärast, et alamlõim leiab lõime poolist lõime, et UI lõime häälestada, ja alamlõim käivitab otse oma koodi ilma UI lõime lõpetamist ootamata. Testkood:
Tulemus:
UI peamine teema: 1 Teema: 5 SynchContext:1
Kokkuvõte:SynchronizationContext objekt UI lõimes, olgu see siis pealõimes või lõimes, käivitatakse põhilõimes, nii et kui koodi on palju aeganõudvat, võib see põhjustada UI liidese hangumise või võltsitud surma!
TegelikultUI lõim ei kasuta SynchronizationContext klassi, vaid WindowsFormsSynchronizationContextSee Dongdong.
System.Threading.SynchronizationContext lähtekood:
WindowsFormsSynchronizationContext lähtekood:
|