問題タブ [background-agent]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - バックグラウンド エージェントのリバース ジオコーディングにより、エージェントによって呼び出される残りのコードの処理時間が速い場合に、ライブ タイルが更新されない
Windows Phone 8 の天気アプリのバックグラウンド エージェントに問題があります。
バックグラウンド エージェントが実行されるたびに、特定の条件 (私が抱えている問題とは無関係) が満たされると、新しい http 天気リクエストが作成されます。これらの条件が満たされない場合、代わりにキャッシュされた気象データが使用されます。
さらに、ライブ タイルの場所を「現在の場所」に設定した場合、バックグラウンド エージェントはリバース ジオコーディングを使用して、現在いる場所のエリアの名前を特定します。これは、新しいデータまたはキャッシュされたデータが使用されるかどうかにかかわらず、つまりアプリのバックグラウンド エージェントが実行されるたびに行われます。
私が抱えている問題は、キャッシュされたデータが使用されるたびに、ライブ タイルが更新されないことです。ただし、ライブ タイルの更新に 2 回以上失敗した場合でも、アプリのバックグラウンド エージェントがブロックされることはないため、例外が発生することはないようです。
これは、スケジュールされたエージェントから呼び出されるバックグラウンド エージェントのビュー モデルの「public async Task getWeatherForTileLocation()」メソッドからの関連する抜粋です。
スケジュールされたエージェントの抜粋:
getWeatherForTileLocation() の抜粋:
setCoordinates メソッド、およびそこから呼び出されるリバース ジオコーディング関連のメソッド:
コードを何度もデバッグしましたが、問題はありませんでした。呼び出されたときの http リクエストは適切であり、キャッシュされたデータの抽出は適切であり、リバース ジオコーディングは常に (最終的に) 場所を返します。
しかし、キャッシュされたデータを使用している場合、スケジュールされたタスクが更新されたライブ タイルを作成した後、スケジュールされたタスクが完了する前に、現在の場所の名前が取得されることに気付きました。
つまり、スケジュールされたエージェントで次のコードが実行された後に、場所の名前が取得されます。
しかし、前に:
明らかに、メモリの制約により、この時点で更新されたビジュアル要素を作成できません。
比較のために、キャッシュされたデータを使用していない場合、リバース ジオコーディング クエリは常に、http 要求コードが終了する前に場所を返すことができます。
ビュー モデルの getWeatherForTileLocation() メソッドは、スケジュールされたエージェントで「await」を使用しているため、現在の場所の名前が取得されるまでメソッドが何も返さないことを確認することにしました。_currentLocation フィールドが値を受け取った後、つまりリバース ジオコーディングが完了した後にのみ終了する単純な while ループをメソッドのフッターに追加しました。
私がデバッグしたとき、このループは約 300 万回繰り返されたと思います (とにかく非常に大きな数です)。しかし、このハック (他にどのように説明すればよいかわかりません) は、デバッグ中に機能するように見えました。つまり、ビルドのターゲットが Lumia 1020 で、そこから新しいライブ タイルを作成したとき、次のように呼び出します。
最初のスケジュールされたタスクを待つ必要がないようにするため。この最初のスケジュールされたタスクをデバッグしたところ、すべて正常に動作しました。1) リバース ジオコーディング リクエストが行われ、2) キャッシュされたデータが正しく抽出され、3) ループが繰り返されている間ハッキングされ、4) リバース ジオコーディングが場所の名前を返すと停止し、5 ) タイルが正常に更新されます。
ただし、キャッシュされたデータを使用する後続のバックグラウンド エージェント呼び出しでは、タイルが更新されないように見えます。ライブ タイルが更新されるのは、キャッシュされていないデータが使用されている場合のみです。この時点で、リバース ジオコーディング クエリは常に、http リクエスト コードが完了する前に場所を返すことができます。つまり、ハッキー ループは 1 回だけ繰り返されます。
キャッシュされたデータが使用されたときにライブ タイルが正しく更新されるようにするために何をする必要があるかについてのアイデアはありますか? また、 getWeatherForTileLocation() が終了するのを私の while ループよりもエレガントに停止する方法はありますか? きっとあるよ!
長い投稿で申し訳ありませんが、できるだけ徹底的にしたかったのです!
これにより、過去 72 時間、(文字通り) 眠れぬ夜が続いています。ご協力とご指導をよろしくお願いいたします。
どうもありがとう。
バルディ
ipc - Windows ユニバーサル アプリとデスクトップ アプリケーション間の通信 (Win 10)
Windows ユニバーサル アプリと同じコンピューターで実行されている標準のデスクトップ アプリケーションとの間の通信を実現する方法はありますか? UA は IPC をサポートしていないと読みました。代わりに、いわゆるバックグラウンド エージェントを使用します。しかし、これらのバックグラウンド エージェントを UA ではなくデスクトップ アプリケーションと通信するために使用することは可能ですか、それとも完全に抑制されていますか?
その理由は、私は既にデスクトップ アプリケーションを持っており、あまり労力をかけずに Cortana サポートを追加したいと考えているからです。そのため、デスクトップ アプリをユニバーサル アプリに変換することは避けたいと考えています。現在、Cortana はユニバーサル アプリでのみ利用できます。