質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

Windows10Phone用のアプリがメモリ不足のためか終了してしまいます

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 623

shin7INE2

score 6

 前提・実現したいこと

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で作っております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる