バックグラウンド アクティビティの最適化

バックグラウンド タスクを使用すると、アプリがフォアグラウンドにない場合にアプリでコードを実行できます。 デスクトップ 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();
}

パッケージ ID でバックグラウンド タスクを使用する

アプリが MSIX でパッケージ化されている場合は、システム トリガー (ネットワーク状態の変更、タイム ゾーン、ユーザープレゼンスなど) に応答して実行されるバックグラウンド タスクを登録することもできます。 これらのタスクでは、UWP で使用できるのと同じ BackgroundTaskBuilder API を使用します。 詳細については、「 バックグラウンド タスクを使用したアプリのサポート」を参照してください

Note

パッケージ アプリ (MSIX) は、システムによってトリガーされる作業に BackgroundTaskBuilder を使用できます。 パッケージ化されていないデスクトップ アプリでは、代わりに標準の.NETスレッド パターンを使用する必要があります。