Optymalizowanie działania w tle

Zadania w tle umożliwiają aplikacji uruchamianie kodu, gdy aplikacja nie znajduje się na pierwszym planie. W aplikacji klasycznej Zestaw SDK do aplikacji systemu Windows działanie w tle ma większą elastyczność niż w aplikacjach platformy UWP, ale nadal należy zarządzać nią w sposób odpowiedzialny, aby zapewnić użytkownikom dobre środowisko pracy.

Ważna

Aplikacje klasyczne Zestaw SDK do aplikacji systemu Windows nie podlegają tym samym ograniczeniom wykonywania w tle co aplikacje platformy UWP. Aplikacje klasyczne mogą swobodnie uruchamiać wątki w tle, obsługiwać długotrwałe zadania i używać standardowych wzorców wątków .NET. Jednak bycie dobrym obywatelem systemu oznacza zminimalizowanie niepotrzebnej pracy, gdy użytkownik nie aktywnie korzysta z aplikacji.

Najlepsze rozwiązania dotyczące działania w tle

Postępuj zgodnie z poniższymi wskazówkami, aby zapewnić wydajność aplikacji:

Zmniejsz pracę, gdy użytkownik nie wchodzi w interakcję z aplikacją

Gdy użytkownik przełączy się do innej aplikacji lub zminimalizuje okno, zmniejsz częstotliwość czasomierzy, sondowania sieci i innej pracy w tle. Oszczędza to baterię i zwalnia zasoby systemowe dla aplikacji, z którymi użytkownik aktywnie pracuje.

Korzystanie z wydajnych wzorców planowania

Używaj planowania opartego na czasomierzu, a nie ciasnych pętli sondowania. W przypadku okresowej pracy użyj DispatcherTimer lub System.Threading.Timer z interwałami odpowiednimi dla danego scenariusza.

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);
    }
}

Reagowanie na stany zasilania i baterii

Sprawdź stan zasilania systemu i odpowiednio dostosuj zachowanie aplikacji. Zmniejsz aktywność w tle, gdy urządzenie działa na baterii i rozważ odroczenie pracy nieistotnych do momentu podłączenia urządzenia.

// 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.
}

Anulowanie pracy w tle po zamknięciu aplikacji

Po zamknięciu aplikacji anuluj wszystkie pozostałe zadania w tle przy użyciu CancellationToken wzorców. Zapobiega to przechowywaniu zasobów systemowych przez aplikację po tym, jak nie jest już widoczna.

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();
}

Używaj zadań w tle z tożsamością pakietu

Jeśli aplikacja jest spakowana przy użyciu pliku MSIX, możesz również zarejestrować zadania w tle uruchamiane w odpowiedzi na wyzwalacze systemowe (takie jak zmiany stanu sieci, strefy czasowe lub obecność użytkownika). Te zadania używają tego samego BackgroundTaskBuilder interfejsu API dostępnego w systemie UWP. Aby uzyskać więcej informacji, zobacz Obsługa aplikacji przy użyciu zadań w tle.

Note

Aplikacje spakietowane (MSIX) mogą używać elementu BackgroundTaskBuilder do zadań wyzwalanych przez system. Aplikacje klasyczne bez pakietu powinny zamiast tego używać standardowych modeli obsługi wątków platformy .NET.