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

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

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

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

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

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

Q&A

1回答

3811閲覧

UWPでApplication.Current.Exit()を行っても画面が残る

hirotamasami

総合スコア5

UWP

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

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

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

0グッド

0クリップ

投稿2020/09/02 06:13

編集2020/09/10 10:52

前提・実現したいこと

UWP初心者です

現在Visual Studio 2017でUWPアプリを作成し
その一つの機能で
アプリ終了のボタンを押下すると、

C#

1Application.Current.Exit();

でアプリを終了する機能を実装しています。

現在端末(Panasonic製 FZ-M1)にアプリをインストールし使用しており、
基本的にはこれでアプリを終了することができるのですが、
まれにアプリ終了実行時に、
画面が作成したロゴのタイルの背景に指定した色の状態になり、
アプリのウィンドウが閉じずに残ってそのままになる場合があります。

この状態になると、
端末のWindowマークのタップやエッジスワイプなどの
操作ができなくなってしまうのですが、
アプリが何かOSに影響を与えているのでしょうか?

アプリ中で非同期でMediaPlayerを複数いっきに開いたり、
Frame.Navigate()による画面遷移とMediaPlayerによる音声ファイル再生(それに伴う画面の表示変更)
を一連で行ったりしてるんですが、
そのあたりの処理がCPUに負荷をかけたりしているのでしょうか?

このようなサイトでの質問も初めてなので、情報不足ありましたら
ご指摘ください。
宜しくお願い致します。

該当のソースコード

アプリ内で音声ファイルの再生時間を取得しています。

C#

1 public sealed partial class PlayerPage : Page 2 { 3 private readonly MediaPlayer _mediaPlayer = new MediaPlayer(); 4 private MediaSource _mediaSource = null; 5 6 public PlayerPage() 7 { 8 this.InitializeComponent(); 9 } 10 11 protected override void OnNavigatedTo(NavigationEventArgs e) 12 { 13 string fileName = (string)e.Parameter; 14 SoundPlay(fileName); 15 } 16 17 private async Task<string> GetPlayTime(string fileName) 18 { 19 TimeSpan time = await GetDuration(fileName); 20 return time.ToString(@"mm\:ss"); 21 } 22 23 private async Task<TimeSpan> GetDuration(string fileName) 24 { 25 StorageFile outfile = await File.GetWavFileAsync(fileName); //対象の音声ファイルでStorageFileを取得する 26 27 MediaPlayer mp = new MediaPlayer(); 28 MediaSource ms = MediaSource.CreateFromStorageFile(outfile); 29 MediaPlayer mp.Source = ms; 30 31 await Task.Delay(1000); 32 TimeSpan t = ((TimeSpan)ms.Duration); 33 34 mp.Dispose(); 35 ms.Dispose(); 36 37 return t; 38 } 39 40 private void SoundPlay(string fileName) 41 { 42 StorageFile outfile = await FilePath.GetWavFileAsync(fileName); 43 44 _mediaSource?.Dispose(); 45 _mediaSource = MediaSource.CreateFromStorageFile(outfile); 46 _mediaPlayer.Source = _mediaSource; 47 48 _mediaPlayer.Play(); 49 } 50 }

試したこと

・タスクマネージャーの確認
上記現象が起こった時、タスクマネージャーのプロセスを確認してもアプリは動いてなかった。
※現象発生後、すぐにタスクマネージャーを確認すると、1瞬だけCPU使用率が100%になっておりました。(すぐに下降)
・イベントビューアーの確認
上記現象が起こった時、イベントログを確認すると、igfxCUIService2.0.0.0が大量に常に出力されていた。
・非同期で再生時間大量読込
下記のようなメソッドを作って実行したが、特に上記のような現象は発生せず

C#

1 private async Task DangerMethod1(string fileName) 2 { 3 int retryCount = 50; 4 for (int i = 0; i < retryCount; i++) 5 { 6 GetDuration(fileName); 7 } 8 }

・連続画面遷移
下記のようなメソッドを作って実行したが、特に上記のような現象は発生せず

C#

1 private void DangerMethod2() 2 { 3 int retryCount = 20; 4 for (int i = 0; i <= retryCount; i++) 5 { 6 if (Frame.CanGoBack) 7 { 8 Frame.GoBack(); 9 } 10 11 Frame.Navigate(typeof(PlayerPage)); 12 } 13 14 }

・デバッグ時の挙動
Application.Current.Exit()の代わりに
ApplicationView.GetForCurrentView().TryConsolidateAsync();
使用すると教えていただいた後、
動作を確認すると、
同現象(タスクバー点滅)が起こった後、
アプリを終了すると、
ロゴのタイルの背景で留まる状態にはなりませんでしたが、
かわりにアプリはそのままの状態で終了しなくなりました。
その時、デバッグ実行停止にすると、
Application.Current.Exit()時と同じく
ロゴのタイルの背景で留まる状態になりました

補足情報(FW/ツールのバージョンなど)

上記の現象はまれにしか発生しないんですが、
発生前はだいたい画面下部に表示されている
タスクバー全体がちかちかと点滅いたします。
まだ数回しか再現しておりませんが、
このタスクバーちかちかが発生した時は、
だいたい上記のPlayerPageに遷移した際に発生しております。

OS バージョン Windows10

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

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

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

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

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

guest

回答1

0

UWPでは ApplicationView.TryConsolidateAsync() を使ってアプリケーションを終了します。

C#

1ApplicationView.GetForCurrentView().TryConsolidateAsync();

投稿2020/09/03 01:54

tor4kichi

総合スコア763

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

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

hirotamasami

2020/09/03 02:25

回答ありがとうございます。 かしこまりました。 Application.Current.Exit(); を ApplicationView.GetForCurrentView().TryConsolidateAsync(); に変更し、 しばらくアプリを使用してみて 様子を見てみます。
hirotamasami

2020/09/04 04:17 編集

お忙しいところ失礼します。 アプリ終了機能を ApplicationView.GetForCurrentView().TryConsolidateAsync(); に変更し、しばらく動作を確認しましたところ、 該当の現象(タスクバーが点滅)が発生したため、 アプリ終了を試してみました。 結果アプリは終了せず、戻り値をawaitで取得したところtrueが返ってきました リンクにしていただいた参照先では ApplicationView.GetForCurrentView().TryConsolidateAsync(); は閉じるの動作と同等の機能を行うとあり、 UWPでは ApplicationView.TryConsolidateAsync() を使ってアプリケーションを終了するとのことでしたが、 では、いざ実際終了できなかった場合、 UWPではアプリを終了できない状態の時、 基本的にはアプリ側からはどうするものなのでしょうか? また、戻り値は終了できるかどうかの結果が返ってくるわけではないということが確認されたので、 失敗したかどうかもどのように確認するのかもわからないのですが、 どのように判断するのが普通なのでしょうか? 可能であれば、アプリ側からアプリを終了できる状態にし、 そのまま終了するのが理想です よろしくお願いします。
tor4kichi

2020/09/04 06:11

TryConsolidateAsyncを試しても変化がなかったんですね。 タスクバーが点滅するというのはOS側のウィンドウ管理システムが異常処理に対応して再起動してるっぽい動きかなと思います。それ以上のことはわかりませんが。 異常状態から正常終了させる方法はわかりませんから、そもそも異常を起こさないようなプログラムを組む方向で考えたほうがいいかもしれません。 一個気になる点でいうと、MediaPlayer.Source に設定したままMediaSource.Dispose()を呼んでいるところでしょうか。 _mediaPlayer.Source = null; _mediaSource?.Dispose(); _mediaSource = new ... _mediaPlayer.Source = _mediaSource; とした方がいいかもしれません。焼け石に水かもしれませんが。 あとは異常が起きない範囲にまでコードを削って問題コードを見つける、みたいな方法ぐらいしか思いつかないです。
hirotamasami

2020/09/04 09:22

かしこまりました。 やっぱり終了できない原因の方を突き止めるしかないということですね 仰って下さったようにMediaSourceやOSのウィンドウ周りを中心に調べてみます。 解決したり、何かわかりましたら またコメントや解決方法からお知らせさせていただきます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問