Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A felhasználók azt várják, hogy az alkalmazás a számítógép típusától függetlenül a számítás közben is válaszképes marad. Ez különböző dolgokat jelent a különböző alkalmazásokhoz. Bizonyosak számára ez a valósághűbb fizikát, az adatok lemezről vagy a weből való gyorsabb betöltését, az összetett jelenetek gyors bemutatását és a lapok közötti navigálást, az irányok megkeresését egy pillanat alatt, vagy az adatok gyors feldolgozását jelenti. A számítások típusától függetlenül a felhasználók azt szeretnék, hogy az alkalmazásuk a bemeneti adatok alapján működjön, és kiküszöbölje azokat a példányokat, ahol nem válaszol, miközben "gondolkodik".
Az alkalmazás eseményvezérelt, ami azt jelenti, hogy a kód egy eseményre reagálva végzi a munkát, majd tétlenül ül a következőig. A felhasználói felület platformkódja (elrendezés, bemenet, események emelése stb.) és az alkalmazás felhasználói felülethez tartozó kódja mind ugyanazon a felhasználói felületen fut. Egyszerre csak egy utasítás hajtható végre ezen a szálon, így ha az alkalmazáskód túl sokáig tart egy esemény feldolgozásához, akkor a keretrendszer nem tudja futtatni az elrendezést, és nem tud új eseményeket létrehozni a felhasználói interakcióknak megfelelően. Az alkalmazás válaszképessége a felhasználói felület szálának a munka feldolgozásához való rendelkezésre állásához kapcsolódik.
A felhasználói felületi szál használatával szinte minden módosítást el kell végeznie a felhasználói felületen, beleértve a felhasználói felületi típusok létrehozását és a tagok elérését. A felhasználói felületet nem frissítheti háttérszálból, de küldhet egy üzenetet a CoreDispatcher.RunAsync segítségével, hogy a kód ott fusson.
Jegyzet Az egyetlen kivétel az, hogy van egy külön renderelési szál, amely felhasználói felületi módosításokat alkalmazhat, amelyek nem befolyásolják a bemenetek kezelését vagy az alapszintű elrendezést. Ezen a renderelési szálon például számos olyan animáció és áttűnés futtatható, amelyek nem befolyásolják az elrendezést.
Késleltesse az elem példányosítását
Az alkalmazások leglassabb szakaszai közé tartozhat az indítás és a nézetváltás. Ne végezze el a szükségesnél több munkát a felhasználó által kezdetben látott felhasználói felület létrehozásához. Például ne hozza létre a fokozatosan feltáruló felhasználói felületet és az előugró ablakok tartalmát.
- A x:Load attribútum vagy x:DeferLoadStrategy használatával elhalaszthatja az elemek példányosítását.
- Igény szerint programozott módon szúrjon be elemeket a fába.
CoreDispatcher.RunIdleAsync sorba állítja a feladatokat, hogy a felhasználói felület szála feldolgozhassa őket, amikor nem foglalt.
Aszinkron API-k használata
Az alkalmazás válaszkészsége érdekében a platform számos API aszinkron verzióját biztosítja. Az aszinkron API biztosítja, hogy az aktív végrehajtási szál ne blokkoljon jelentős ideig. Amikor meghív egy API-t a felhasználói felületi szálról, használja az aszinkron verziót, ha elérhető. Az aszinkron mintákkal történő programozásról további információt az Aszinkron programozás vagy az Aszinkron API-k meghívása c# vagy Visual Basic nyelven című témakörben talál.
Munka átirányítása háttérszálakra
Írjon úgy eseménykezelőket, hogy azok gyorsan visszatérjenek. Nem triviális mennyiségű munka esetén ütemezze a feladatot egy háttérszálra, majd térjen vissza.
A munkát aszinkron módon ütemezheti a C#
Ne feledje, hogy a felhasználói felület elemei csak a felhasználói felületi szálból érhetők el. A felhasználói felületi szál használatával hozzáférhet a felhasználói felület elemeihez a háttérmunka elindítása előtt, és/vagy CoreDispatcher.RunAsync vagy CoreDispatcher.RunIdleAsync a háttérszálon.
Egy háttérszálon elvégezhető munka például a számítógépes AI kiszámítása egy játékban. A számítógép következő lépését kiszámító kód végrehajtása sok időt vehet igénybe.
public class AsyncExample
{
private async void NextMove_Click(object sender, RoutedEventArgs e)
{
// The await causes the handler to return immediately.
await System.Threading.Tasks.Task.Run(() => ComputeNextMove());
// Now update the UI with the results.
// ...
}
private async System.Threading.Tasks.Task ComputeNextMove()
{
// Perform background work here.
// Don't directly access UI elements from this method.
}
}
Public Class AsyncExample ' ... Private Async Sub NextMove_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Await Task.Run(Function() ComputeNextMove()) ' update the UI with results End Sub Private Async Function ComputeNextMove() As Task ' ... End Function ' ... End Class
Ebben a példában a NextMove_Click kezelő a várakozik a-n, hogy a felhasználói felület szála reszponzív maradjon. A végrehajtás azonban újra megjelenik a kezelőben, miután ComputeNextMove (amely egy háttérszálon fut) befejeződik. A kezelő fennmaradó kódja frissíti a felhasználói felületet az eredményekkel.
Jegyzet Az UWP-hez tartozik egy ThreadPool és ThreadPoolTimer API is, amely hasonló forgatókönyvekhez használható. További információért lásd: Szálkezelés és aszinkron programozás.