1

tcp ソケット接続 (独自のクローズド プロトコル) を使用するプロジェクトを作成し、ネットワーク トリガー API を使用してバックグラウンド接続を追加しまし。タイムソケットは何かを受け取ります。

バックグラウンドタスクでコードをデバッグするためにあらゆることを試しましたが、無駄です:

  • 表示されているアプリをジェスチャーで閉じる
  • 画面をロックする
  • Windowsにアプリを一時停止させるために、他の重いアプリケーションをロードしようとしました

これらはすべて、ソケット メッセージ中にバックグラウンド タスクを実行 (およびデバッグ) するのに役立ちませんでした。私は何を間違っていますか?これを機能させるには、WinRT タブレットなどの別の中断可能なデバイスを入手する必要がありますか?

4

1 に答える 1

1

デフォルトでは、参照プロジェクトはメイン プロジェクトに追加されません。これは見かけほど明白ではないので、私はこれを見つけるのにほぼ 1 週間を費やしました。手がかりは次のとおりです。参照プロジェクトのアクセシビリティを確認してください

更新:

開発中に発見したように、対処すべきことがいくつかあります。それらのいくつかは、必要なほど明確ではありません。ここに私がしたことのリストがあります:

  1. バックグラウンド プロジェクトをメイン プロジェクトの参照に追加します (ソリューション ブラウザーで参照ノードを右クリックします)。
  2. メイン プロジェクトのマニフェストに適切な宣言が含まれているかどうかを確認します (コントロール チャネル付きのバックグラウンド タスク、完全なパッケージを含む適切なバックグラウンド エントリ ポイント名、実行可能ファイルとしての $targetnametoken$.exe)。
  3. #1から導かれること:バックグラウンドで使用する予定のすべてのエンティティは、ソリューション内の別のプロジェクトに配置する必要があります. このプロジェクトは、メイン プロジェクトとバックグラウンド プロジェクトの両方から参照されます。
  4. ControlChannelTrigger を登録する前に BackgroundExecutionManager.RequestAccessAsync() が呼び出されることに注意してください。
  5. サンプル プロジェクトの 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 スレッド (特に待機中のもの) の呼び出しに注意してください。アプリが実行されるまで実行されず、待機します。

于 2012-08-06T14:30:29.643 に答える