Optimalizace aktivity na pozadí

Úlohy na pozadí umožňují aplikaci spustit kód, když aplikace není v popředí. V desktopové Windows App SDK aplikaci má aktivita na pozadí větší flexibilitu než v aplikacích pro UPW, ale přesto byste ji měli spravovat zodpovědně, abyste zajistili dobré prostředí pro uživatele.

Important

Desktopové aplikace Windows App SDK nepodléhají stejným omezením běhu na pozadí jako aplikace UWP. Desktopové aplikace můžou spouštět vlákna na pozadí volně, udržovat dlouhotrvající úlohy a používat standardní vzory .NET vláken. Být dobrým občanem systému ale znamená minimalizaci nepotřebné práce, když uživatel vaši aplikaci aktivně nepoužívá.

Osvědčené postupy pro aktivitu na pozadí

Pokud chcete zajistit efektivitu aplikace, postupujte podle těchto pokynů:

Omezení práce, když uživatel nepracuje s vaší aplikací

Když uživatel přepne do jiné aplikace nebo minimalizuje okno, snižte frekvenci časovačů, dotazování v síti a další práci na pozadí. Tím se šetří baterie a uvolní se systémové prostředky pro aplikaci, se kterými uživatel aktivně pracuje.

Použití efektivních vzorů plánování

Používejte plánování pomocí časovače místo smyček aktivního dotazování. Pro pravidelné úlohy použijte DispatcherTimer nebo System.Threading.Timer s intervaly odpovídajícími vašemu scénáři.

private DispatcherTimer _updateTimer;

private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
    if (args.WindowActivationState == WindowActivationState.Deactivated)
    {
        // Window is no longer active — slow down updates.
        _updateTimer.Interval = TimeSpan.FromSeconds(30);
    }
    else
    {
        // Window is active — use normal update rate.
        _updateTimer.Interval = TimeSpan.FromSeconds(2);
    }
}

Reakce na stav napájení a baterie

Zkontrolujte stav napájení systému a odpovídajícím způsobem upravte chování aplikace. Snižte aktivitu na pozadí, když zařízení běží na baterii, a zvažte odložení práce, která není nezbytná, dokud se zařízení nezapojte.

// Check power status using Windows.System.Power
var batteryStatus = Windows.System.Power.PowerManager.BatteryStatus;
var energySaverStatus = Windows.System.Power.PowerManager.EnergySaverStatus;

if (energySaverStatus == Windows.System.Power.EnergySaverStatus.On)
{
    // Reduce background work when Battery Saver is active.
    DisableNonEssentialUpdates();
}

void DisableNonEssentialUpdates()
{
    // Pause non-essential timers, syncs, and animations here.
}

Zrušení práce na pozadí při zavření aplikace

Když se aplikace vypne, zrušte všechny zbývající úlohy na pozadí pomocí CancellationToken vzorů. Tím zabráníte, aby vaše aplikace držela systémové prostředky, jakmile už nebude viditelná.

private CancellationTokenSource _cts = new();

private async Task DoBackgroundWorkAsync()
{
    while (!_cts.Token.IsCancellationRequested)
    {
        await Task.Delay(TimeSpan.FromSeconds(10), _cts.Token);
        // Perform periodic work.
    }
}

private void MainWindow_Closed(object sender, WindowEventArgs args)
{
    _cts.Cancel();
}

Použití úloh na pozadí s identitou balíčku

Pokud je vaše aplikace zabalená pomocí MSIX, můžete také zaregistrovat úlohy na pozadí spuštěné v reakci na aktivační události systému (například změny stavu sítě, časová pásma nebo přítomnost uživatelů). Tyto úlohy používají stejné BackgroundTaskBuilder rozhraní API dostupné v UPW. Další informace najdete v tématu Podpora aplikace pomocí úloh na pozadí.

Note

Zabalené aplikace (MSIX) můžou používat BackgroundTaskBuilder pro práci aktivovanou systémem. Nebalené desktopové aplikace by měly místo toho používat standardní vzory .NET vláken.