Modell patakok
Windows Presentation Foundation (WPF) alkalmazások létre, hogy segítse a fejlesztők nehézségek elkerülése a tervezési folyamat. Ennek eredményeként a legtöbb WPF fejlesztők nem kell írni egy felületet használó több mint egy szál. Mivel a többszálú programok bonyolult és nehéz a hibakeresés, el kell kerülni, ha van egyszálú megoldásokat.
Függetlenül attól, hogy a minőségi építészet, UI, nem platform nem tud ajánlani egy egyszálú megoldás minden típusú probléma. WPF alkalmazás elég közel kéznél, hogy megoldja ezt a problémát, de még mindig vannak olyan helyzetek, amikor több szálon teljesítményének javítására felhasználói felület (UI) és az alkalmazások teljesítményét. Áttekintése után néhány alapvető anyag ebben a dokumentumban tárgyalja ezeket a helyzeteket, és végül beszéljük meg további részleteket.
Ez a rész a következő részekben.
Fejlődő WPF alkalmazások általában kezdődik két stream: az egyik a megjelenítés feldolgozása, és egyéb UI ellenőrzéseket. Áramlásábrázolás végezzük gyakorlatilag láthatatlan a felhasználó a háttérben, miközben a UI szál kap bemenet, kezeli azokat az eseményeket jeleníti meg a képet a képernyőre, és végrehajtja alkalmazás kódját. A legtöbb alkalmazás egy szál UI, bár egyes esetekben jobb, hogy egy pár. Később, úgy kell tekinteni, mint egy példát.
UI adatfolyam sorokban dolgozni elemek belsejében a tárgy, az úgynevezett diszpécser. Object Diszpécser ki az operációs elemek alapján prioritásokat és végrehajtja mindegyikük a befejezésig. Minden UI szál kell legalább egy tárgy diszpécser. Diszpécser és mindegyik egység képes elvégezni a munkát tételek csak egy patak.
Előfeltétele az épület egy érzékeny, tiszta felhasználói alkalmazások, hogy maximalizálja a termelékenységet a diszpécser. természetvédelmi munkát példány kicsi. Ezzel a módszerrel az elemek soha nem lesz elavult a kiosztási sorban feldolgozásra váró. Minden késlekedés a bemeneti adatokat, és a válasz is csalódást a felhasználó.
Mivel ebben az esetben a WPF alkalmazást kell feldolgoznia a nagy tranzakciók? Mi van, ha a kód tartalmaz egy nagyobb vagy számítással van szükség a lekérdezés az adatbázis egy távoli szerveren? Általában a nagy tranzakciók feldolgozása egy külön téma, így a UI szál szabadon szolgáltatási elemek a diszpécser sorban. Befejezése után a nagy művelet, akkor adja át az eredményt vissza a UI szál kijelzőn.
Történelmileg, a Windows operációs rendszer lehetővé teszi a hozzáférést a felhasználói felület elemeit csak létrehozni az áramlás. Ez azt jelenti, hogy a háttérben téma, amely felelős egy bizonyos ideig a feladat, nem tudja frissíteni a szövegmezőbe annak befejezését. Windows létrehozza ezt a korlátozást, integritásának biztosítása az UI komponensek. A lista tűnhet, furcsa, ha annak tartalma frissül háttér szál a folyamat látható.
WPF támogatja a beépített kölcsönös kizárási mechanizmus, amely elvégzi ezt a koordinációt. Az osztályok többsége WPF származnak az osztály DispatcherObject. Amikor létrehoz egy DispatcherObject tárolja egy hivatkozás a diszpécser. társított aktuális végrehajtó szálat. Tény, DispatcherObject társul a menet, amely azt létrehozta. Végrehajtása során a program DispatcherObject hívhatjuk nyitott módszer VerifyAccess. VerifyAccess ellenőrzi a diszpécser. kapcsolatos jelenlegi patak, és összehasonlítja azt hivatkozva a diszpécser. ami megmarad létrehozása során. Ha nem egyezik, VerifyAccess eljárás kivételt dob. VerifyAccess a hívás elején az egyes módszerek tartozó DispatcherObject objektumot.
Ha csak egy szál lehet változtatni a UI, mint a háttér szálak kölcsönhatásba a felhasználó? A háttérben téma kérheti az UI szál a művelet végrehajtásához a nevében. Ezt úgy éri el kimutatjuk a működtető tag a tárgy diszpécser UI téma. Diszpécser osztály kétféleképpen regisztráció munka példány: Invoke és BeginInvoke. Mindkét módszer rendelni egy küldöttet végrehajtását. Indítsunk eljárás egy szinkron hívás - nem tér vissza, amíg a UI szál befejezi végrehajtását küldöttje. BeginInvoke módszer aszinkron és azonnal visszatér.
Object Diszpécser megrendelések az elemeket a prioritásos sor. Vannak tíz szintet lehet megadni, ha hozzá egy elemet a sorhoz diszpécser. Ezek a prioritások vannak tárolva DispatcherPriority lista. További részletek a szintek DispatcherPriority megtalálható a Windows SDK dokumentációban.
Egy példa a egyszálú alkalmazás teljesítő hosszadalmas számítások
A legtöbb grafikus felhasználói felülettel (GUI) töltik a legtöbb időt álló tétlen várakozás események, hogy a generált válasz a felhasználói műveletekre. A gondos programozás ez üresjárati időt lehet használni konstruktívan csökkentése nélkül UI válasz sebességet. WPF threading modell nem engedélyezi a bemenet megszakítja a műveletet, hogy zajlik az UI szál. Ez azt jelenti, hogy rendszeresen vissza kell térnie a diszpécser objektumra. feldolgozzák a függőben lévő bemeneti eseményeket, mielőtt azok elavultak.
Tekintsük a következő példát:

Ez az egyszerű alkalmazás keres prímszámok, kezdve három-től. Amikor a felhasználó rákattint a Start gombra a keresés elindításához. Ha a program talál egy prímszám, akkor frissíti a felhasználói felület. Bármely ponton lehet állítani a keresést.
Annak ellenére, hogy az egyszerűség a keresési műveleteket prímszám lehet végtelen, hogy néhány problémával. Ha az összes keresési műveleteket végzett feldolgozás a kattintás eseménykezelő gombok UI áramlás soha nem volt lehetősége, hogy kezelje egyéb eseményeket. UI nem válaszol a beérkező vagy feldolgozni az üzeneteket. Soha nem frissítette a kijelző, és nem reagál a gombra kattintva.
Kereshet prímszám egy külön téma, de akkor is kell foglalkozni szinkronizációs problémák. Az egyszálú megközelítés közvetlenül aktualizálja a címkét, amely a legnagyobb prímszám szerepel.
Ha megtöri a feladat számítási kezelhető egységekre, lehetséges, hogy menjen vissza rendszeresen a tárgy és a feldolgozás Diszpécser eseményeket. WPF alkalmazás kell adni a lehetőséget, hogy frissítse és folyamat bemeneti.
A legjobb módja annak, hogy partíciót a feldolgozási idő között kiszámítását és feldolgozását események ellenőrzése számítás diszpécser objektumra. Használata BeginInvoke módszer lehet ütemezni, hogy ellenőrizze prímszám ugyanabban a sorban, ahonnan jön a UI esemény. A példában a tervezett ellenőrzés csak egy prímszám minden egyes időpontban. A vizsgálat után, elsődleges a következő ellenőrzés a tervek szerint azonnal. Ez az ellenőrzés csak akkor kerül végrehajtásra feldolgozását követően a függőben lévő UI eseményeket.

Ezzel a Microsoft Word alkalmazás mechanizmus ellenőrzi a helyesírást. Helyesírás-ellenőrzés történik a háttérben, a holtidő a UI szál. Nézzük meg a kódot.
A következő példa bemutatja a XAML, hogy létrehozza a felhasználói felületet.
Ez a módszer ellenőrzi, hogy a következő páratlan szám prím. Ha ez egy egyszerű módszer közvetlenül frissíti a bigPrime TextBlock. hogy az tükrözze a keresési eredmények között. Ezt megtehetjük, mert a számítási fordul elő ugyanazon szál létrehozásához használt összetevő. Ha egy külön téma a számításokhoz kellett volna használni egy bonyolultabb szinkronizációs mechanizmus, és végre frissítések a UI szál. Ez a helyzet tovább fog mutatni.
Teljes forráskódját egy példát látni. Lásd egyszálú Alkalmazás hosszan futó kiszámítása minta ( „Egy példa az egyszálú alkalmazás teljesítő hosszas számításokat”).
Feldolgozási műveletek blokkoló háttérben téma
zár művelet feldolgozása egy grafikus alkalmazás lehet egy nehéz feladat. Nem fogjuk hívni a módszerek blokkoló esemény rakodók, mert az alkalmazás leállt. Lehetőség van egy külön téma, hogy kezelni ezeket a tranzakciókat, de aztán össze kell hangolni az UI szál, hiszen nem lehet közvetlenül megváltoztatni a GUI a munkafolyamat. Box küldöttek UI folyni Diszpécser objektum lehet elérni Invoke módszer vagy BeginInvoke. Ennek eredményeként, ezek a küldöttek találkoztak indítvány változtatni a felhasználói felület elemeit.
Ebben a példában azt szimulálni egy távoli eljárás hívás fogadó időjárás. Mi egy külön szálat, hogy végre a hívást, és tervezi, hogy frissítse a módszer az objektum UI áramlási Diszpécser végén.
