前提・実現したいこと
UWP初心者です
Visual Studio 2017で作成したUWPアプリを使用しているのですが、
使用中にタスクバーが点滅する現象が発生しており、
タスクマネージャーを確認すると
タスクバーが点滅している間、
どうやら
windows problem reportingや問題レポートがほぼ一定の間隔で
繰り返し起動(実行?)しており、
信憑性モニターを確認すると、
explorer.exeが繰り返し動作停止しているようです。
対策しようにも
アプリ中でエクスプローラーをどうこうしている部分がいまいち見当たらず、
どこを確認すればいいかもわかりません。
アプリではMediaPlayerクラスをもちいて、
音声ファイルにアクセスしているんですが、
その時の音声ファイルアクセスの際のフォルダへのアクセスが失敗しているのでしょうか?
(フォルダ、ファイル取得はStorageFolder,StrageFileを用いているが、StorageFolderがエクスプローラーを動かしている?)
またこの時、複数の音声ファイルに非同期で同時にアクセス(MediaPlayerのインスタンスを同時作成)しているんですが、
これがよろしくないんでしょうか?
またはエクスプローラーは関係なく、
Pageの描画が複雑だったりすると起こったりするのでしょうか?
アプリの挙動やソースコードを確認する限りでは、
これらが実行された後に発生しているように感じるのですが、
どのように原因究明、対策を行えばよろしいでしょうか?
このようなサイトでの質問もまだ慣れておらず、情報不足ありましたら
ご指摘ください。
宜しくお願い致します。
試したこと
・CPU大幅使用中のMediaPlayerで音声ファイル同時読込
Windows Sysinternalsで提供されている"CPUSTRES"を利用し
CPUに負荷をかけた状態でMediaPlayerで音声ファイル同時読込を行ったところ
普段より現象が発生しやすいように感じました。
※それでも確実に発生するわけではないので、あくまで実際に動かした感覚
https://docs.microsoft.com/ja-jp/sysinternals/downloads/cpustres
・非同期で再生時間大量読込
C#
1public sealed partial class PlayerPage : Page 2 { 3 4 readonly Player _player = Player.Instance; 5 List<TimeSpan> = _soundPlayTimeList; 6 7 public PlayerPage() 8 { 9 this.InitializeComponent(); 10 } 11 12 protected override void OnNavigatedTo(NavigationEventArgs e) 13 { 14 SetSoundTimeList(); 15 } 16 17 public async Task SetSoundTimeList() 18 { 19 List<string> fileNameList = await FileAccess.GetSoundFileNameList(); // 使用するファイル名を全て取得。このメソッドではファイル名を非同期で一気に取得はしてません 20 _soundPlayTimeList = (await Task.WhenAll(fileNameList.Select(x => _player.GetDuration(x)))).ToList(); //ここが怪しい? 21 } 22 23 } 24 25 26public class Player 27 { 28 public static player Instance { get; } = new player(); 29 30 private readonly MediaPlayer _mediaPlayer = new MediaPlayer(); 31 private MediaSource _mediaSource = null; 32 33 private async Task<string> GetPlayTime(string fileName) 34 { 35 TimeSpan time = await GetDuration(fileName); 36 return time.ToString(@"mm\:ss"); 37 } 38 39 private async Task<TimeSpan> GetDuration(string fileName) 40 { 41 StorageFile outfile = await File.GetWavFileAsync(fileName); //対象の音声ファイルでStorageFileを取得する 42 43 MediaPlayer mp = new MediaPlayer(); 44 MediaSource ms = MediaSource.CreateFromStorageFile(outfile); 45 MediaPlayer mp.Source = ms; 46 47 await Task.Delay(1000); 48 TimeSpan t = ((TimeSpan)ms.Duration); 49 50 mp.Dispose(); 51 ms.Dispose(); 52 53 return t; 54 } 55 56 private void SoundPlay(string fileName) 57 { 58 StorageFile outfile = await FilePath.GetWavFileAsync(fileName); 59 60 _mediaSource?.Dispose(); 61 _mediaSource = MediaSource.CreateFromStorageFile(outfile); 62 _mediaPlayer.Source = _mediaSource; 63 64 _mediaPlayer.Play(); 65 } 66 }
・複数種の端末で現象確認
一応サーフェスとタフパッド(パナソニック製 FZ-M1)の2種類(タフパッドは3台)
で現象を確認しております
※一時知人に借りていたものを使用したのでバージョンなどは不明
補足情報(FW/ツールのバージョンなど)
OS バージョン Windows10