デフォルトでは、参照プロジェクトはメイン プロジェクトに追加されません。これは見かけほど明白ではないので、私はこれを見つけるのにほぼ 1 週間を費やしました。手がかりは次のとおりです。参照プロジェクトのアクセシビリティを確認してください。
更新:
開発中に発見したように、対処すべきことがいくつかあります。それらのいくつかは、必要なほど明確ではありません。ここに私がしたことのリストがあります:
- バックグラウンド プロジェクトをメイン プロジェクトの参照に追加します (ソリューション ブラウザーで参照ノードを右クリックします)。
- メイン プロジェクトのマニフェストに適切な宣言が含まれているかどうかを確認します (コントロール チャネル付きのバックグラウンド タスク、完全なパッケージを含む適切なバックグラウンド エントリ ポイント名、実行可能ファイルとしての $targetnametoken$.exe)。
- #1から導かれること:バックグラウンドで使用する予定のすべてのエンティティは、ソリューション内の別のプロジェクトに配置する必要があります. このプロジェクトは、メイン プロジェクトとバックグラウンド プロジェクトの両方から参照されます。
- ControlChannelTrigger を登録する前に BackgroundExecutionManager.RequestAccessAsync() が呼び出されることに注意してください。
- サンプル プロジェクトの 1 つの小さなコメントで、重要なことを見つけました。
// IMPORTANT: When using winRT based transports such as StreamWebSocket with the ControlChannelTrigger,
// we have to use the raw async pattern for handling reads instead of the await model.
// Using the raw async pattern allows Windows to synchronize the PushNotification task's
// IBackgroundTask::Run method with the return of the receive completion callback.
// The Run method is invoked after the completion callback returns. This ensures that the app has
// received the data/errors before the Run method is invoked.
// It is important to note that the app has to post another read before it returns control from the completion callback.
// It is also important to note that the DataReader is not directly used with the
// StreamWebSocket transport since that breaks the synchronization described above.
// It is not supported to use DataReader's LoadAsync method directly on top of the transport. Instead,
// the IBuffer returned by the transport's ReadAsync method can be later passed to DataReader::FromBuffer()
// for further processing.
詳細はこちら - http://code.msdn.microsoft.com/windowsapps/ControlChannelTrigger-91f6bed8/sourcecode?fileId=57961&pathId=2085431229
すべてを適切に行っていれば、バックグラウンド タスクのデバッグは簡単です。ブレークポイントを置いて続行するだけで、メインプロジェクトが実行中または中断されていることを気にする必要はありません。
ps - プロジェクトが中断されている場合は、UI スレッド (特に待機中のもの) の呼び出しに注意してください。アプリが実行されるまで実行されず、待機します。