Unity3Dにコルーチンがあり、サーバーからzipをダウンロードして永続データパスに抽出し、その内容をメモリにロードしました。フローは次のようになります。
IEnumerator LongCoroutine()
{
yield return StartCoroutine(DownloadZip());
ExtractZip();
yield return StartCoroutine(LoadZipContent());
}
しかし、このExtractZip()
方法(DotNetZipライブラリを使用)は同期的であり、時間がかかりすぎて、プロセス中に処理する場所がありません。
これにより、大きなzipを抽出しようとすると(モバイルデバイスで)アプリケーションが強制終了されました。これは、メインスレッドが長時間応答しなくなったことが原因と考えられます。
これはモバイルOSが行うことが知られていることですか(フレームに時間がかかりすぎる場合はアプリを終了します)?
したがって、別のスレッドでzipを抽出すると問題が解決する可能性があると想定しましたが、うまくいったようです。私はこのクラスを作成しました:
public class ThreadedAction
{
public ThreadedAction(Action action)
{
var thread = new Thread(() => {
if(action != null)
action();
_isDone = true;
});
thread.Start();
}
public IEnumerator WaitForComplete()
{
while (!_isDone)
yield return null;
}
private bool _isDone = false;
}
そして私はそれを次のように使用します:
IEnumerator LongCoroutine()
{
yield return StartCoroutine(DownloadZip());
var extractAction = new ThreadedAction(ExtractZip);
yield return StartCoroutine(extractAction.WaitForComplete());
yield return StartCoroutine(LoadZipContent());
}
しかし、これがそれを実装するための最良の方法であるかどうか、またはロックする必要があるかどうかはまだ_isDone
わかりません(マルチスレッドにあまり慣れていない)。
これで何か問題が発生する可能性がありますか/何か不足していますか?