前提・実現したいこと
VisualStudioを使い、C#でWindowsPhone用のアプリを、ユニバーサルアプリで作っております。
Windows10Phone上のアプリの画面で、利用者が特定のIDを入力するとある所に利用者の位置情報を送信し続けるというものです。
更に、スリープ状態でも実行し続けるようにというのを目標にしております。
発生している問題・エラーメッセージ
チーム内では上司がJavaScriptで同様のアプリを作り、無事にスマホ内で、スリープ状態でも動くものを完成させております。
しかし、私はWindows10Phone通常はは動くがスリープ状態では動かないものをまず作ったのち、自分が見聞きした情報を組み合わせて、とりあえずPC上で、VisualStudioの「ライフサイクルイベント」で「中断」を選んでも動くアプリにしたのですが、それをWindows10Phoneにインストールしたところ、データを送信し始めると同時に終了するものになってしまいました。
私はVisualStudioにDebug.WriteLineで、GC.GetTotalMemory(false)の値を表示したり、あるいは延長実行でExtendedExecutionResultが実行されると+1、session.Dispose()だと-1などという形でセッション数をカウントしたりした結果、セッション数が16を超えると、「ライフサイクルイベント」で「中断」を選んでも安定する、またGC.GetTotalMemory(false)は1000000~2000000くらいで安定する、というのは色々自分で動かして調べました。
そんな我流で作ったアプリゆえ、どんどんメモリを使い続けてしまいます。PCで動かした時も、20分もすると10000000バイトくらいは使っているようです。
正直な話、
・延長実行の基本的な事が分かっていないので上手く動かない
・Windows10Phoneアプリとしてはメモリを食い過ぎなので動かない
このどちらが原因なのかすら、まだ分からないのです。
色々と調べて、MemoryManagerというものを使って予めアプリに必要な容量を大きく摂っておけば動くのかな、などと勝手に考えておりますが、それが正しいのかどうかすら分かりません。
非常に抽象的な質問になってしまいすみません。コードの一部分と流れを下に掲載しますが、これでは分からないとおっしゃる方がいらっしゃるようでしたら、より詳しく全コードを掲載いたします。
よろしくお願いします。
エラーメッセージ
該当のソースコード
C#
//中略
private ObservableCollection<string> coordinates = new ObservableCollection<string>();
//mainの前に、こんなコレクション型を準備しております
public MainPage()
{
this.InitializeComponent();
dtm = new DispatcherTimer();
dtm.Interval = new TimeSpan(0, 0, 1);
dtm.Tick += new EventHandler<object>(dispatcherTimer_TickAsync);
}
dispatcherTimer_TickAsync(object sender, object e)
{
DateTime dt = new DateTime();
//・・・
Geolocator locator = new Geolocator{};
//・・・
//try~catch文の中で
var response = await client.GetAsync("http通信のための文字列");
}
//という関数で、時刻と座標を取得し、それをHttpClientのオブジェクトのclientに入れて動かします。
private async Task<int> RequestExtendedExecution()
{
session = new ExtendedExecutionSession();
session.Description = "Location Tracker";
session.Reason = ExtendedExecutionReason.LocationTracking;
session.Revoked += ExtendedExecutionSession_Revoked;
var result = await session.RequestExtensionAsync();
if (result == ExtendedExecutionResult.Allowed)
{
coordinates.Insert(0, "Extended execution SUCCESS");
//~
}
}
//という形で、ExtendedExecutionSession()を使えるメソッドを作っております。
//他に、延長終了やrevokeするメソッドもあります。MicrosoftのExtendedExecutionに関するgithubのコードなどを真似ました
private async void positionChangedasync(Geolocator sender, PositionChangedEventArgs args)
{
//ここでは座標の変化を読み取ります。そして
var _ = Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
//
coordinates.Insert(0, s);
}
//問題はここです
if (fc2 == 0 && GC.GetTotalMemory(false) < 2000000 && sesnum<16)
{
await RequestExtendedExecution();
}
else
{
EndExtendedExecution();
}
//ここにこれらを入れたら、PC上ではライフサイクルイベントを中断にしても動くようになったのですが、Windows10Phoneでは全く動かなくなってしまいました。
}
試したこと
上記の通りあれこれ試したのですが、行き当たりばったりなので困っています。そしてteratailの皆様に伺う事にいたしました。
補足情報(FW/ツールのバージョンなど)
VisualStudio 2017で作っております。
あなたの回答
tips
プレビュー