Windows アプリ SDK デスクトップ アプリでのバックグラウンド実行

ユーザーが別のアプリに切り替えた場合でも、Windows アプリ SDKで構築されたデスクトップ アプリは継続的に実行されます。 この記事では、バックグラウンド実行のしくみについて説明し、効率のベスト プラクティスを推奨します。

Important

デスクトップ アプリは、UWP アプリと同様 にシステムによって自動的に中断または終了されません 。 アプリは、ユーザーがアプリを閉じるか、プロセスが終了するまで実行を続行します。 無期限に実行するために特別な API や制限付き機能は必要ありません。 必要に応じて、システム メモリ通知を使用してリソースの負荷に対応します。

デスクトップ アプリはバックグラウンドでネイティブに実行されます

UWP では、バックグラウンドで無期限に実行するには、 extendedBackgroundTaskTime 制限された機能とエンタープライズ展開が必要です。 デスクトップ アプリには、この制限はありません。 アプリのスレッドは引き続き実行され、タイマーは起動し続け、ウィンドウが表示されているかどうかに関係なくネットワーク接続は開いたままです。

つまり、次のことが可能になります。

  • サーバーへの永続的な接続 (チャット アプリ、リアルタイム監視など) を維持します。
  • 長い計算 (ビデオ エンコード、データ分析など) を実行します。
  • スケジュールに従って更新を確認します。
  • オーディオを再生し、メディア コントロールを更新します。

バッテリ効率のベスト プラクティス

デスクトップ アプリは制限なく実行できますが、バッテリ駆動デバイスでは良い市民であると、ユーザー エクスペリエンスが向上します。 バックグラウンドで過剰な CPU またはネットワークを使用している場合、システムはアプリに重いリソース コンシューマーとしてフラグを設定する可能性があります。

ウィンドウが表示されない場合の作業の削減

// m_window is your app's main Window; _updateTimer is a DispatcherTimer field.
Microsoft.UI.Xaml.Window m_window = this;
Microsoft.UI.Xaml.DispatcherTimer _updateTimer = new();

m_window.Activated += (sender, args) =>
{
    if (args.WindowActivationState == WindowActivationState.Deactivated)
    {
        // Window lost focus — slow down background processing
        _updateTimer.Interval = TimeSpan.FromSeconds(30);
    }
    else
    {
        // Window is active — resume full-speed processing
        _updateTimer.Interval = TimeSpan.FromSeconds(1);
    }
};

電源対応パターンを使用する

  • タイマーの頻度を減らす - アプリがバックグラウンドにあるときに、サブ秒からマルチ秒の間隔に切り替えます。
  • 重要でないレンダリングを一時停止 する - アニメーション、GPU の作業、画面の更新を停止します。
  • バッチ ネットワーク要求 — 複数の要求を、より少ない大きな要求に結合します。
  • バッテリーセーバーを尊重 する — PowerManager.BatteryStatus を確認し、デバイスがバッテリ使用時の作業を減らします。
using Windows.System.Power;

private bool _enableBackgroundSync = true;

private void CheckPowerState()
{
    if (PowerManager.BatteryStatus == BatteryStatus.Discharging &&
        PowerManager.RemainingChargePercent < 20)
    {
        // Reduce background work significantly
        _enableBackgroundSync = false;
    }
}

イベント ドリブン作業にバックグラウンド タスクを使用する

アプリが継続的に実行せずにシステム イベント (タイマー、プッシュ通知、ネットワークの変更など) に応答する必要がある場合は、代わりにバックグラウンド タスクを使用することを検討してください。

var builder = new BackgroundTaskBuilder
{
    Name = "PeriodicSync",
    TaskEntryPoint = "MyApp.Background.SyncTask"
};
builder.SetTrigger(new TimeTrigger(15, false));
builder.Register();

Note

バックグラウンド タスクでは、登録に MSIX パッケージ ID が必要です。 アプリがパッケージ化されていない場合は、代わりにインプロセス タイマーまたはスケジュールされたタスクを使用します。

重要な作業向けの実行時間延長

電源管理によって中断されない作業 (大きなファイルの保存など) がある場合は、 拡張実行セッションを使用します。 これは、バッテリ駆動デバイスでも、作業が重要であることをシステムに通知します。

UWP バックグラウンド実行との比較

特徴 UWP デスクトップ
アプリがバックグラウンドで実行される バックグラウンド タスクまたは制限された機能でのみ いつも
機能宣言が必要 はい (extendedBackgroundTaskTime) いいえ
システムが終了してリソースを保存する はい いいえ
バッテリー 節約機能の調整 システムによって制限が適用される アプリは自己規制する必要がある
イベント駆動型作業のバックグラウンド タスク 主なメカニズム 省略可能な補語