Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 22231|Antwoord: 0

[Communicatie] .net/c# SynchronizationContext voor details

[Link kopiëren]
Geplaatst op 15-03-2018 11:51:07 | | | |
Ik heb veel introductieartikelen gelezen over hoe je de hoofdinterface in de achtergronddraad kunt bijwerken, en de meeste gebruiken Control.Invoke en Control.BeginInvoke. Dit zijn goede oplossingen, maar er zijn twee problemen:

1. Je moet System.Windows.Forms raadplegen en vervolgens System.Windows.Forms gebruiken

2. De codestructuur is relatief rommelig. (Eigenlijk wordt dit ook veroorzaakt door #1)

Microsoft biedt een andere, elegantere oplossing, namelijk System.Threading. SynchronizationContext。 Zoals je ziet, staat het niet in namesapce System.Windows.Forms, dus we kunnen het rechtmatig gebruiken in BusinessLaryer, Controler en zelfs modules.

En het is erg handig in gebruik, je hoeft je alleen te richten op de volgende twee methoden:

1. Verzenden: Stuurt een updateverzoek naar de hoofdthread, waarbij de huidige thread wordt geblokkeerd totdat deze terugkeert.

2. Post: Stuurt een updateverzoek voor de interface naar de hoofdthread zonder de huidige thread te blokkeren.

In feite zijn ze allemaal dezelfde methode, behalve dat verzenden synchroon is en post asynchroon is


Voor Form1-vorm = nieuwe Form1(), was het SynchronizationContext-object leeg, en toen het Form1-formulier werd geïnstantieerd, werd het SynchronizationContext-object aan deze thread toegevoegd. Dus het antwoord is dat wanneer het Control-object wordt aangemaakt, het SynchronizationContext-object wordt ook aangemaakt en aan de thread gekoppeld. Alles wanneer je de vorm InitializeComponent() gebruikt; Als dit eenmaal is gedaan, kan het een object krijgen dat niet NULL is


Ten slotte het verschil tussen de Sendt()- en Post()-methoden van SynchronizationContext:

Send() wordt geïmplementeerd door simpelweg de delegate op de huidige thread aan te roepen (synchrone aanroep). Dat wil zeggen, de UI-thread wordt direct op de subthread aangeroepen om uit te voeren, en de subthread blijft uitvoeren nadat de uitvoering van de UI-thread is voltooid.

Post() wordt geïmplementeerd door een delegate op de threadpool aan te roepen (asynchrone aanroep). Dit komt doordat de subthread een thread uit de threadpool vindt om de UI-thread af te stemmen, en de subthread direct zijn eigen code uitvoert zonder te wachten tot de UI-thread klaar is.
Testcode:

Resultaat:

UI hoofddraad: 1
Draad: 5
SynchContext:1


Samenvatting:Het SynchronizationContext-object op de UI-thread, of het nu wordt aangeroepen in de hoofdthread of in de thread, wordt uitgevoerd op de hoofdthread, dus wanneer er veel tijdrovende code is, zal de UI-interface bevriezen of doen alsof het overlijden is

EigenlijkDe UI-thread gebruikt niet de SynchronizationContext-klasse, maar WindowsFormsSynchronizationContextDeze Dongdong.





System.Threading.SynchronizationContext-broncode:


WindowsFormsSynchronizationContext-broncode:







Vorig:Zevenenveertig manieren om een C#-programma te optimaliseren
Volgend:.net/c# Shanghai Pai Shanghai Brand Assistant [met broncode]
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com