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