Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 22231|Odpoveď: 0

[Komunikácia] .net/c# SynchronizationContext pre podrobnosti

[Kopírovať odkaz]
Zverejnené 15. 3. 2018 11:51:07 | | | |
Prečítal som si mnoho úvodných článkov o tom, ako aktualizovať hlavné rozhranie v pozadí vlákna, a väčšina z nich používa Control.Invoke a Control.BeginInvoke. Sú to dobré riešenia, ale sú tu dva problémy:

1. Musíte odkazovať na System.Windows.Forms a potom použiť System.Windows.Forms

2. Štruktúra kódu je pomerne chaotická (neprehľadná). (V skutočnosti je to spôsobené aj #1)

Microsoft ponúka ďalšie, elegantnejšie riešenie, ktorým je System.Threading. SynchronizationContext。 Ako vidíte, nie je v namesapce System.Windows.Forms, takže ho môžeme oprávnene použiť v BusinessLaryer, Controler a dokonca aj v moduloch.

A je veľmi pohodlný na používanie, stačí sa zamerať na nasledujúce dve metódy:

1. Odoslať: Odosiela požiadavku na aktualizáciu rozhrania hlavnému vláknu, blokujúc aktuálne vlákno, kým sa nevráti.

2. Post: Odošle požiadavku na aktualizáciu rozhrania do hlavného vlákna bez zablokovania aktuálneho vlákna.

V skutočnosti sú všetky rovnaká metóda, okrem toho, že send je synchronný a post je asynchrónny


Pred formulárom Form1 = novým Form1() bol objekt SynchronizationContext prázdny a keď bol formulár Form1 inštanciovaný, objekt SynchronizationContext bol pripojený k tomuto vláknu. Takže odpoveď je, že keď sa vytvorí riadiaci objekt, objekt SynchronizationContext je tiež vytvorený a pripojený k vláknu. Všetko pri použití formulára InitializeComponent(); Keď je to urobené, môže získať objekt, ktorý nie je NULL


Nakoniec rozdiel medzi metódami SynchronizationContext Sendt() a Post():

Send() sa implementuje jednoduchým zavolaním delegáta na aktuálnom vlákne (synchronné volanie). To znamená, že UI vlákno je priamo volané na podvlákno na vykonanie a podvlákno bude pokračovať vo vykonávaní aj po dokončení UI vlákna.

Post() sa implementuje zavolaním delegáta do poolu vlákien (asynchrónne volanie). Je to preto, že podvlákno nájde vlákno z poolu vlákien na doladenie UI vlákna a podvlákno priamo spustí svoj vlastný kód bez čakania na dokončenie UI vlákna.
Testovací kód:

Výsledok:

Hlavné vlákno UI: 1
Vlákno: 5
SynchContext:1


Súhrn:Objekt SynchronizationContext na UI vlákne, či už volaný v hlavnom vlákne alebo vo vlákne, sa spustí na hlavnom vlákne, takže keď je veľa časovo náročného kódu, UI rozhranie zamrzne alebo predstiera smrť

V skutočnostiUI vlákno nepoužíva triedu SynchronizationContext, ale WindowsFormsSynchronizationContextTento Dongdong.





Zdrojový kód System.Threading.SynchronizationContext:


Zdrojový kód WindowsFormsSynchronizationContext:







Predchádzajúci:Štyridsaťsedem spôsobov, ako optimalizovať C# program
Budúci:.net/c# Shanghai Pai Shanghai Brand Assistant [so zdrojovým kódom]
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com