Sok bevezető cikket olvastam arról, hogyan lehet frissíteni a fő felületet a háttér szálban, és ezek többsége Control.Invoke és Control.BeginInvoke funkciókat használ. Ezek jó megoldások, de két probléma van:
1. Hivatkoznod kell a System.Windows.Forms oldalra, majd használnod a System.Windows.Forms formátumot
2. A kódstruktúra viszonylag kuszoly. (Valójában ezt is a #1 okozza)
A Microsoft egy másik, elegánsabb megoldást kínál, a System.Threadinget. SynchronizationContext。 Ahogy látod, nincs a namesapce System.Windows.Forms formátumban, így jogosan használhatjuk BusinessLaryerben, Controlerben és még modulokban is.
És nagyon kényelmes használni, csak a következő két módszerre kell koncentrálnod:
1. Küldés: Felületfrissítési kérelmet küld a fő szálnak, blokkolva a jelenlegi szálat, amíg vissza nem tér.
2. Bejegyzés: Felületfrissítési kérelmet küld a fő szálhoz anélkül, hogy blokkolná a jelenlegi szálat.
Valójában mindegyik ugyanaz a módszer, csak hogy a send szinkron, a post aszinkron
A Form1 form = új Form1() előtt a SynchronizationContext objektum üres volt, és amikor a Form1 formát megvalósították, a SynchronizationContext objektumot ehhez a szálhoz csatolták. Tehát a válasz az, hogy amikor létrehozzák a Control objektumot, a SynchronizationContext objektum is létrejön és csatlakozik a szálhoz. Mindez az InitializeComponent( űrlap használatakor; Ha ez megtörténik, olyan objektumot kaphat, amely nem NULL
Végül a SynchronizationContext Sendt() és Post() módszereinek különbsége:
A Send() egyszerűen úgy valósítható meg, hogy a jelenlegi szál delegáltját hívjuk (szinkron hívás). Vagyis a UI szálat közvetlenül az alszálon hívják végrehajtásra, és az alszál a felület végrehajtása után is folytatódik.
A Post() úgy valósítható meg, hogy meghívják a thread pool-on egy delegált (aszinkron hívás). Ez azért van, mert az alszál talál egy szálat a szál poolból, hogy hangolja az UI szálat, és az alszál közvetlenül saját kódot futtat anélkül, hogy megvárná a UI szál befejezését. Tesztkód:
Eredmény:
UI fő téma: 1 Szál: 5 SynchContext:1
Összefoglalás:A SynchronizationContext objektum a UI szálon, akár a fő szálban, akár a szálban hívják, a fő szálon fog végrehajtani, így amikor sok időigényes kód van, az a UI interfész lefagyását vagy hamis-halálát okozza!
ValójábanA UI szál nem a SynchronizationContext osztályt használja, hanem a WindowsFormsSynchronizationContextEz a Dongdong.
System.Threading.SynchronizationKontextus forráskód:
WindowsFormsSynchronizationContext forráskód:
|