Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 22231|Válasz: 0

[Kommunikáció] .net/c# SynchronizationContext részletekért

[Linket másol]
Közzétéve 2018. 03. 15. 11:51:07 | | | |
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:







Előző:Negyvenhét módja egy C# program optimalizálásának
Következő:.net/c# Shanghai Pai Shanghai márkaasszisztens [forráskóddal]
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com