背景任務讓你的應用程式在應用程式不在前景時執行程式碼。 在桌面版 Windows 應用程式 SDK 應用程式中,背景活動比 UWP 應用程式更有彈性,但你仍應負責任地管理,以確保使用者有良好的使用體驗。
Important
桌面版 Windows 應用程式 SDK 應用程式不受 UWP 應用程式相同的背景執行限制。 桌面應用程式可以自由執行背景執行緒,維護長時間執行的任務,並使用標準的 .NET 執行緒模式。 然而,成為系統的良好公民意味著在使用者未積極使用你的應用程式時,盡量減少不必要的工作。
背景活動的最佳做法
請遵循以下指引,讓您的應用程式保持高效:
當使用者不與你的應用程式互動時,減少工作量
當使用者切換到其他應用程式或縮小視窗時,請減少計時器、網路輪詢及其他背景作業的頻率。 這樣可以節省電池,並釋放系統資源給使用者正在使用的應用程式。
使用有效的排程模式
使用以計時器為基礎的排程,而非緊密輪詢迴圈。 對於週期性工作,請依您的使用情境使用 DispatcherTimer 或 System.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 執行緒模式。