DotNetZIp阻止团结

时间:2017-04-09 10:36:25

标签: c# unity3d dotnetzip

我使用Ionic.Zip.dll从unity中提取zip文件。

适用于zip.ExtractAll(zipPath, ExtractExistingFileAction.OverwriteSilently);

但是,在提取存档时,UI会挂起(按钮效果等等)。 因此我尝试在协程中使用它但没有结果,我认为这是错误的方式。

你是否已经以这种方式提取了一些东西?

编辑:

由于Unity限制,我在跟踪线程函数的完成时遇到了问题。 最后用bool和coroutine完成它:

   public bool extractionDone = false;
   IEnumerator CheckLauncherExtracted() {
       while(!extractionDone) yield return null;
       Debug.Log("ExtractionDone done !");
       OnLauncherFilesExtracted();
   }
    public void Extraction(){
        StartCoroutine("CheckLauncherExtracted");
        ThreadPool.QueueUserWorkItem(x => {
            FileManager.ExtractZipToDirectory(zipPath, zipExtractPath);
            extractionDone = true;
        });
    }

1 个答案:

答案 0 :(得分:1)

如果zip.ExtractAll阻止主Thread或导致打嗝,请在新的ThreadThreadPool中使用它。任何这些都应该解决你的问题。在这种情况下,Coroutine不会帮助您,除非您使用的压缩API专门用于与Unity的协程一起使用。

使用ThreadPool

解决此问题
void Start()
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(ExtractFile));
}

private void ExtractFile(object a)
{
    zip.ExtractAll(zipPath, ExtractExistingFileAction.OverwriteSilently);
}

请注意,您无法从另一个线程调用Unity的功能。例如,上面的ExtractFile函数在另一个Thread中调用,如果您尝试在该函数中使用Unity API,则会出现异常。有关如何在另一个Thread中使用Unity API,请参阅here