Windows 8 のバックグラウンド タスクでネットワーク状態の変化を確認しようとしています。msdnでバックグラウンド タスクの登録に関する正確な詳細を確認できます。
どれが最適かをテストするために、いくつかのイベントを登録しました。
BackgroundTaskManager.RegisterBackgroundTask(
BackgroundTaskManager.NetworkTaskEntryPoint,
Constants.NetworkAvailable,
new SystemTrigger(SystemTriggerType.NetworkStateChange, false),
new SystemCondition(SystemConditionType.InternetAvailable));
BackgroundTaskManager.RegisterBackgroundTask(
BackgroundTaskManager.NoNetworkTaskEntryPoint,
Constants.NetworkUnAvailable,
new SystemTrigger(SystemTriggerType.NetworkStateChange, false),
new SystemCondition(SystemConditionType.InternetNotAvailable));
BackgroundTaskManager.RegisterBackgroundTask(
BackgroundTaskManager.InternetTaskEntryPoint,
Constants.InternetAvailable,
new SystemTrigger(SystemTriggerType.InternetAvailable, false),
null);
テストするために、フライトモードを有効にして無効にします。次のイベント (システムトリガー/条件) を取得します。
- NetworkStateChange/InternetNotAvailable
- プログラム '[xxx] backgroundTaskHost.exe: Managed (v4.0.30319)' はコード 1 (0x1) で終了しました。
- NetworkStateChange/InternetNotAvailable
- プログラム '[xxx] backgroundTaskHost.exe: Managed (v4.0.30319)' はコード 1 (0x1) で終了しました。
- NetworkStateChange/InternetNotAvailable
- プログラム '[xxx] backgroundTaskHost.exe: Managed (v4.0.30319)' はコード 1 (0x1) で終了しました。
- NetworkStateChange/InternetNotAvailable
- プログラム '[xxx] backgroundTaskHost.exe: Managed (v4.0.30319)' はコード 1 (0x1) で終了しました。
- NetworkStateChange/InternetAvailable InternetAvailable (SystemTrigger)
- NetworkStateChange/InternetAvailable
- プログラム '[xxx] backgroundTaskHost.exe: Managed (v4.0.30319)' はコード 1 (0x1) で終了しました。
- NetworkStateChange/InternetAvailable
- プログラム '[xxx] backgroundTaskHost.exe: Managed (v4.0.30319)' はコード 1 (0x1) で終了しました。
- NetworkStateChange/InternetAvailable
- プログラム '[xxx] backgroundTaskHost.exe: Managed (v4.0.30319)' はコード 1 (0x1) で終了しました。
そのため、条件 Unavailable で 4 回、条件 Available で 4 回、InternetAvailable で 1 回 (正しい) の NetworkStateChange を取得しています。
バックグラウンド タスクでは、次のコードをテストするだけです。
public void Run(IBackgroundTaskInstance taskInstance)
{
// keep track that we're no longer connected
Debug.WriteLine("Background " + taskInstance.Task.Name + " Starting...");
ApplicationData.Current.LocalSettings.Values[BackgroundTaskManager.NetworkConnectedKey] = true;
}
GetDeferral() も追加しようとしましたが、非同期コードがないため、実際の問題はありません。すべてのメソッドのコードも同じであり、すべてのタスクが一度だけ登録されることに注意してください。