Windows 10 Mobile のアプリケーションは起動に20秒以上かかると起動せずに落ちる

Windows 10 Mobile のアプリケーションで起動時にファイル操作を「同期処理」であれこれやっていて結構時間がかかっているのですが、Visual Studio からデバッグ実行している限りでは問題なく動作し、W10M から単体でアプリケーションを起動すると、起動が完了する前に落ちてしまいます。

最初この現象の理由がわからずデバッグ実行での確認もできないので悩んでいました。例外をキャッチしてログを出すようにもしていたのですが、何でもないような処理のところでプログラムが落ち、例外もまったく発生しませんでした。

しかし、何回かやっているうちに気づいたのですが、ログの出力時間を確認したら最初のログの時間と落ちるタイミングの時間の差が20秒であることに気づきました。試しに Task.Delay.Wait で待機させるようにしたらもっと前の処理で落ちることを確認できました。

Windiws Phone 7 か 8 あたりでも、処理に時間がかかって UI? に処理を戻さないとアプリケーションが落ちるという話は聞いたことがあるのですが、このことをしばらく思い出せなくて盲点でした。デバッグ実行では落ちないし、例外も発生しないので気を付けなければいけませんね。

余談ですが、ファイルアクセス処理はファイルがあるかどうかのチェックだけでも1回あたり1秒ぐらいかかるので非同期処理のほうがいいですね。

]]>

[XNA] 別々のスレッドで ContentManager を使用して同じコンテンツを同時に読み込もうとすると例外が発生する

ユーザーの操作レスポンスを改善するためにバックグラウンドでコンテンツを読み込む際、複数のスレッドから同時にコンテンツを読み込もうとすると例外が発生します。

例えば以下のようにプログラムを組むと現象を確認できます。

worker = new BackgroundWorker();
worker.DoWork += (sender, args) =>
  {
    texture = Content.Load("Bitmap");
  };
worker.RunWorkerAsync();
texture = Content.Load("Bitmap");

 

例外が発生するか所は実行タイミングによってメインスレッドであるかバックグラウンドであるかはまちまちです。場合によっては例外が発生しない場合もあります。そのため、原因がわかりにくいエラーになりやすいので注意しましょう。

ちなみに Windows Phone 環境では例外のメッセージが「ArgumentException(Value does not fall within the expected range.」となっており解釈しにくいメッセージになっていますが、Windows 環境では「同一のキーを含む項目が既に追加されています。」と表示されます。コンテンツが完全に読み込まれるまではディクショナリに追加されないので、同時に2つ追加しようとして発生するエラーのようですね。

]]>