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