Spouštění na pozadí v desktopových aplikacích Windows App SDK

Desktopové aplikace vytvořené pomocí Windows App SDK běží nepřetržitě, i když uživatel přepne do jiné aplikace. Tento článek vysvětluje, jak funguje spouštění na pozadí, a doporučuje osvědčené postupy pro zajištění efektivity.

Important

Desktopové aplikace nejsou systémem automaticky pozastavené nebo ukončené způsobem , jakým jsou aplikace pro UPW. Aplikace pokračuje v běhu, dokud ji uživatel nezavře nebo se proces neukončí. K neomezenému spuštění nejsou nutná žádná speciální rozhraní API ani omezené možnosti. Pomocí systémových oznámení paměti můžete v případě potřeby reagovat na tlak na prostředky.

Desktopové aplikace běží nativně na pozadí.

V UWP vyžadoval neomezený běh na pozadí omezenou schopnost extendedBackgroundTaskTime a podnikové nasazení. Desktopové aplikace toto omezení nemají. Vlákna vaší aplikace se budou dál spouštět, časovače se pořád spouštějí a síťová připojení zůstanou otevřená bez ohledu na to, jestli je vaše okno viditelné.

To znamená, že můžete:

  • Udržujte trvalá připojení k serverům (například chatovací aplikace, monitorování v reálném čase).
  • Spusťte dlouhé výpočty (například kódování videa, analýza dat).
  • Hlasování o aktualizacích podle plánu
  • Přehrajte zvuk a aktualizujte ovládací prvky médií.

Osvědčené postupy pro efektivitu baterie

Přestože desktopové aplikace mohou běžet bez omezení, ohleduplné chování na zařízeních napájených z baterie zlepšuje uživatelský komfort. Systém může označit vaši aplikaci jako náročný příjemce prostředků, pokud používá nadměrné využití procesoru nebo sítě na pozadí.

Omezení práce v případech, kdy není okno viditelné

// m_window is your app's main Window; _updateTimer is a DispatcherTimer field.
Microsoft.UI.Xaml.Window m_window = this;
Microsoft.UI.Xaml.DispatcherTimer _updateTimer = new();

m_window.Activated += (sender, args) =>
{
    if (args.WindowActivationState == WindowActivationState.Deactivated)
    {
        // Window lost focus — slow down background processing
        _updateTimer.Interval = TimeSpan.FromSeconds(30);
    }
    else
    {
        // Window is active — resume full-speed processing
        _updateTimer.Interval = TimeSpan.FromSeconds(1);
    }
};

Používejte vzory s ohledem na spotřebu energie

  • Snižte frekvenci časovače – přepněte z intervalů kratších než jedna sekunda na vícesekundové intervaly, když je aplikace na pozadí.
  • Pozastavte nepodstatné vykreslování – Zastavte animace, činnost GPU a aktualizace obrazovky.
  • Dávkové síťové požadavky — Zkombinujte více požadavků do menšího počtu větších.
  • Respektujte spořič baterie – Zkontrolujte PowerManager.BatteryStatus a omezte práci, když je zařízení na baterii.
using Windows.System.Power;

private bool _enableBackgroundSync = true;

private void CheckPowerState()
{
    if (PowerManager.BatteryStatus == BatteryStatus.Discharging &&
        PowerManager.RemainingChargePercent < 20)
    {
        // Reduce background work significantly
        _enableBackgroundSync = false;
    }
}

Použití úloh na pozadí pro práci řízenou událostmi

Pokud vaše aplikace potřebuje reagovat na systémové události (například časovač, nabízená oznámení nebo změna sítě), aniž by běžela nepřetržitě, zvažte místo toho použití úlohy na pozadí:

var builder = new BackgroundTaskBuilder
{
    Name = "PeriodicSync",
    TaskEntryPoint = "MyApp.Background.SyncTask"
};
builder.SetTrigger(new TimeTrigger(15, false));
builder.Register();

Note

Úlohy na pozadí vyžadují identitu balíčku MSIX pro registraci. Pokud je vaše aplikace rozbalená, použijte místo toho časovače v procesu nebo naplánované úlohy.

Prodloužený běh pro kritické úlohy

Pokud máte práci, která by neměla být přerušena řízením spotřeby (například uložením velkého souboru), použijte rozšířenou relaci provádění. To signalizuje systém, že vaše práce je důležitá, a to i na zařízeních s bateriemi.

Porovnání se spouštěním na pozadí UWP

funkce UPW Stolní počítač
Aplikace běží na pozadí Pouze s úlohami na pozadí nebo omezenými možnostmi Vždy
Vyžaduje deklaraci schopností. Ano (extendedBackgroundTaskTime) Ne
Systém se ukončí kvůli úspoře prostředků. Ano Ne
Omezení výkonu v režimu úspory baterie Systém vynucuje omezení Aplikace by měla samoregulovat
Úlohy na pozadí pro práci řízenou událostmi Primární mechanismus Volitelný doplněk