Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Användarna förväntar sig att din app förblir dynamisk medan den utför beräkningen, oavsett typ av dator. Det innebär olika saker för olika appar – att tillhandahålla realistisk fysik, läsa in data från disken eller webben, presentera komplexa scener, navigera mellan sidor eller bearbeta data. Oavsett typ av beräkning vill användarna att din app ska agera på sina indata och eliminera instanser där den inte svarar.
Appen är händelsedriven: koden utför arbete som svar på en händelse och är sedan inaktiv till nästa händelse. Plattformskod för användargränssnitt (layout, indata, höjning av händelser) och appens kod för användargränssnittet körs alla på samma användargränssnittstråd. Endast en instruktion körs på tråden i taget, så om din appkod tar för lång tid att bearbeta en händelse kan ramverket inte köra layouten eller skapa nya händelser. Svarstiden för din app är relaterad till tillgängligheten för användargränssnittstråden för att bearbeta arbete.
Du måste använda användargränssnittstråden för att göra nästan alla ändringar i användargränssnittselement. Du kan inte uppdatera användargränssnittet från en bakgrundstråd, men du kan skicka ett meddelande till det med DispatcherQueue.TryEnqueue för att få koden att köras där.
Important
I WinUI 3-skrivbordsappar använder du DispatcherQueue i stället för UWP CoreDispatcher. Få åtkomst till dispatcher-kön via fönstrets DispatcherQueue egenskap eller DispatcherQueue.GetForCurrentThread().
Note
En separat återgivningstråd kan tillämpa ändringar i användargränssnittet som inte påverkar hur indata hanteras eller den grundläggande layouten. Till exempel kan många animeringar och övergångar som inte påverkar layouten köras på den här återgivningstråden.
Instansiering av fördröjningselement
Några av de långsammaste momenten i en app är uppstart och att växla mellan vyer. Utför inte mer arbete än nödvändigt för att ta upp användargränssnittet som användaren ser från början. Skapa till exempel inte användargränssnittet för progressivt innehåll eller popup-innehåll.
- Använd attributet x:Load för att fördröja instansieringen av element.
- Infoga element programmatiskt i trädet på begäran.
Använd DispatcherQueue.TryEnqueue med låg prioritet för att lägga arbete i kö för användargränssnittstråden att bearbeta när den inte är upptagen.
Använd asynkrona API:er
Om du vill hålla appen dynamisk använder du asynkrona versioner av API:er när de är tillgängliga. Ett asynkront API säkerställer att din aktiva exekveringstråd aldrig blockeras under någon längre tid. När du anropar ett API från UI-tråden använder du alltid den asynkrona versionen om det finns någon.
Avlasta arbete till bakgrundstrådar
Skriv händelsehanterare som returnerar snabbt. När en icke-trivial mängd arbete behöver utföras, schemalägg det på en bakgrundstråd och returnera.
Du kan schemalägga arbete asynkront med hjälp av operatorn await i C#. Garanterar dock await inte att arbetet körs på en bakgrundstråd. Många Windows App SDK API:er schemalägger arbete på en bakgrundstråd åt dig, men om du anropar din appkod med hjälp av endast awaitkör du den metoden i användargränssnittstråden. Du måste uttryckligen köra appkoden i en bakgrundstråd. I C# gör du detta genom att skicka kod till Task.Run.
Kom ihåg att du bara kan komma åt gränssnittselement från användargränssnittstråden. Använd användargränssnittstråden för att komma åt gränssnittselement innan du startar bakgrundsarbete, eller använd DispatcherQueue.TryEnqueue i bakgrundstråden för att publicera UI-uppdateringar tillbaka till användargränssnittstråden.
public sealed partial class MainWindow : Window
{
// Declared in MainWindow.xaml as x:Name="statusText".
private TextBlock statusText;
private async void NextMove_Click(object sender, RoutedEventArgs e)
{
// The await causes the handler to return immediately.
await Task.Run(() => ComputeNextMove());
// Now update the UI with the results.
// This code runs on the UI thread after ComputeNextMove completes.
statusText.Text = "Move computed.";
}
private void ComputeNextMove()
{
// Perform background work here.
// Don't directly access UI elements from this method.
}
}
I det här exemplet returnerar NextMove_Click-hanteraren vid await så att UI-tråden förblir responsiv. Körningen återupptas i hanteraren igen efter att ComputeNextMove (som körs i en bakgrundstråd) har slutförts, och den återstående koden uppdaterar användargränssnittet med resultaten.
Relaterat innehåll
Windows developer