Megosztás a következőn keresztül:


A felhasználói felület szálának rugalmasan tartása

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.

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# várakozási operátorával, a a Visual Basic operátorával vagy a C++ delegáltjaival. Ez azonban nem garantálja, hogy az ütemezett munka háttérszálon fog futni. A Windows univerzális platform (UWP) API-k közül sok ütemezi a munkát a háttérszálon, de ha az alkalmazás kódját csak await vagy egy delegált használatával hívja meg, akkor a delegáltat vagy metódust a felhasználói felület szálán futtatja. Explicit módon meg kell mondania, hogy mikor szeretné futtatni az alkalmazáskódot egy háttérszálon. A C#-ban és a Visual Basicben ezt úgy teheti meg, hogy kódot ad át a Task.Runnak.

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.

  • egyéni felhasználói interakciók