DotNetZIp 阻塞统一

DotNetZIp blocking unity

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

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

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

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

编辑:

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

   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;
        });
    }

如果 zip.ExtractAll 阻塞了主要 Thread 或导致打嗝,请在新的 ThreadThreadPool 中使用它。这些中的任何一个都可以解决您的问题。在这种情况下,协程不会帮助您,除非您使用的压缩 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,您将得到一个异常。请参阅 here 了解如何在另一个 Thread.

中使用 Unity API