See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 22231|Vastuse: 0

[Kommunikatsioon] .net/c# SynchronizationContext detailide jaoks

[Kopeeri link]
Postitatud 15.03.2018 11:51:07 | | | |
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:







Eelmine:47 viisi C# programmi optimeerimiseks
Järgmine:.net/c# Shanghai Pai Shanghai brändiassistent [lähtekoodiga]
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com