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
或导致打嗝,请在新的 Thread
或 ThreadPool
中使用它。这些中的任何一个都可以解决您的问题。在这种情况下,协程不会帮助您,除非您使用的压缩 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
我正在使用 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
或导致打嗝,请在新的 Thread
或 ThreadPool
中使用它。这些中的任何一个都可以解决您的问题。在这种情况下,协程不会帮助您,除非您使用的压缩 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
.