2017-04-09 50 views
0

我正在使用Ionic.Zip.dll從統一中提取zip文件。DotNetZIp阻止統一

它運作良好,與zip.ExtractAll(zipPath, ExtractExistingFileAction.OverwriteSilently);

但同時存檔提取的UI掛起(按鈕效果,等等)。 所以我試圖在協程中使用它,但沒有得到任何結果,我認爲這是錯誤的方法。

你已經用這種方式提取了東西嗎?

編輯:

我有問題跟蹤,因爲統一限制螺紋功能的完成。 最後用布爾和協程做到了:

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

如果zip.ExtractAll擋住了主Thread或引起打嗝,在新ThreadThreadPool使用它。其中任何一種都可以解決您的問題。在這種情況下,除非您使用的壓縮API專門用於Unity的協同程序,否則Coroutine將無法爲您提供幫助。

ThreadPool修復此:

void Start() 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback(ExtractFile)); 
} 

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

請注意,你不能從另一個線程調用統一的功能。例如,上面的ExtractFile函數在另一個Thread中調用,如果您嘗試在該函數內使用Unity API,則會得到一個異常。有關如何在另一個Thread中使用Unity API,請參見here

+0

謝謝,是否可以在提取結束時在主線程中觸發回調,告訴它是否可以繼續它的過程? – FLX

+0

問題解決了,謝謝 – FLX

+0

我看到你在編輯中做了什麼。你不必這樣做。請使用我提供的鏈接重新閱讀我的答案。在'zip.ExtractAll'之後,你可以完成''UnityThread.executeInUpdate(()=> {0}}你的回調函數() });'就是這樣。 – Programmer