Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 22231|Răspunde: 0

[Comunicare] .net/c# SynchronizationContext pentru detalii

[Copiază linkul]
Postat pe 15.03.2018 11:51:07 | | | |
Am citit multe articole introductive despre cum să actualizezi interfața principală în thread-ul de fundal, iar majoritatea folosesc Control.Invoke și Control.BeginInvoke. Acestea sunt soluții bune, dar există două probleme:

1. Trebuie să faceți referire la System.Windows.Forms și apoi să folosiți System.Windows.Forms

2. Structura codului este relativ dezordonată. (De fapt, acest lucru este cauzat și de #1)

Microsoft oferă o altă soluție mai elegantă, și anume System.Threading. SynchronizationContext。 După cum vezi, nu este în namesapce System.Windows.Forms, deci îl putem folosi în mod legitim în BusinessLaryer, Control și chiar module.

Și este foarte convenabil de folosit, trebuie să te concentrezi doar pe următoarele două metode:

1. Trimite: Trimite o cerere de actualizare a interfeței către firul principal, blocând firul curent până când acesta revine.

2. Postare: Trimite o cerere de actualizare a interfeței către firul principal fără a bloca firul curent.

De fapt, toate sunt aceeași metodă, cu excepția faptului că send este sincron, iar post-ul este asincron


Înainte de Form1 form = new Form1(), obiectul SynchronizationContext era gol, iar când formularul Form1 era instanțiat, obiectul SynchronizationContext era adăugat acestui fir. Deci răspunsul este că atunci când obiectul Control este creat, obiectul SynchronizationContext este de asemenea creat și atașat firului de execuție. Toate acestea atunci când se folosește formularul InitializeComponent(); Odată ce acest lucru este făcut, poate obține un obiect care nu este NULL


În final, diferența dintre metodele Sendt() și Post() din SynchronizationContext:

Send() este implementat prin simpla chemare a delegatului pe firul curent (apel sincron). Adică, thread-ul UI este apelat direct pe subthread pentru a fi executat, iar subthread-ul va continua să ruleze după finalizarea execuției.

Post() este implementat prin apelarea unui delegat pe pool-ul de fire (apel asincron). Acest lucru se datorează faptului că subthread-ul va găsi un fir din pool-ul de fire pentru a regla thread-ul UI, iar subthread-ul va executa direct propriul său cod fără să aștepte ca thread-ul UI să se finalizeze.
Cod de test:

Rezultat:

Firul principal UI: 1
Fir de discuție: 5
SynchContext:1


Rezumat:Obiectul SynchronizationContext de pe thread-ul UI, fie chemat pe firul principal, fie în firul principal, va fi executat pe firul principal, astfel încât atunci când există mult cod care consumă mult timp, interfața UI va îngheța sau va simula moartea

De faptFirul UI nu folosește clasa SynchronizationContext, ci WindowsFormsSynchronizationContextAcesta este Dongdong.





Cod sursă System.Threading.SynchronizationContext:


Cod sursă WindowsFormsSynchronizationContext:







Precedent:Patruzeci și șapte de moduri de a optimiza un program C#
Următor:.net/c# Shanghai Pai Shanghai Brand Assistant [cu cod sursă]
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com