優化背景活動

背景任務讓你的應用程式在應用程式不在前景時執行程式碼。 在桌面版 Windows 應用程式 SDK 應用程式中,背景活動比 UWP 應用程式更有彈性,但你仍應負責任地管理,以確保使用者有良好的使用體驗。

Important

桌面版 Windows 應用程式 SDK 應用程式不受 UWP 應用程式相同的背景執行限制。 桌面應用程式可以自由執行背景執行緒,維護長時間執行的任務,並使用標準的 .NET 執行緒模式。 然而,成為系統的良好公民意味著在使用者未積極使用你的應用程式時,盡量減少不必要的工作。

背景活動的最佳做法

請遵循以下指引,讓您的應用程式保持高效:

當使用者不與你的應用程式互動時,減少工作量

當使用者切換到其他應用程式或縮小視窗時,請減少計時器、網路輪詢及其他背景作業的頻率。 這樣可以節省電池,並釋放系統資源給使用者正在使用的應用程式。

使用有效的排程模式

使用以計時器為基礎的排程,而非緊密輪詢迴圈。 對於週期性工作,請依您的使用情境使用 DispatcherTimerSystem.Threading.Timer,並設定適合的間隔。

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

對電源與電池狀態的反應

檢查系統的電源狀態,並相應調整應用程式的行為。 當裝置使用電池時,減少背景活動,並考慮將非必要的工作延後,直到裝置插上電源。

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

應用程式關閉時取消背景工作

當您的應用程式關閉時,請使用 CancellationToken 模式取消任何剩餘的背景工作。 這可防止您的應用程式在不再可見後繼續占用系統資源。

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

使用具有套件身分識別的背景任務

如果你的應用程式是搭配 MSIX 包裝,你也可以註冊背景任務,這些任務會根據系統觸發條件(例如網路狀態變化、時差或使用者在線狀態)執行。 這些任務使用與 UWP 相同的 BackgroundTaskBuilder API。 欲了解更多資訊,請參閱 使用背景工作支援您的應用程式

Note

封裝應用程式(MSIX)可以使用 BackgroundTaskBuilder 來執行系統觸發的工作。 未封裝的桌面應用程式應該改用標準的 .NET 執行緒模式。