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

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

新規登録して質問してみよう
ただいま回答率
85.48%
UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

0回答

311閲覧

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

shin7INE2

総合スコア8

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2018/08/01 12:01

前提・実現したいこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問