Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.