2017-04-09 2 views
0

Ich benutze Ionic.Zip.dll, um eine ZIP-Datei aus der Einheit zu extrahieren.DotNetZIp blockierende Einheit

Es funktioniert gut mit zip.ExtractAll(zipPath, ExtractExistingFileAction.OverwriteSilently);

Aber während das Archiv der UI hängen (Schaltfläche Effekte, etc ...) extrahiert. Also habe ich versucht, das in einer Coroutine zu verwenden, aber habe kein Ergebnis, ich denke, es ist der falsche Weg.

Haben Sie schon etwas auf diese Weise extrahiert?

EDIT:

hatte ich Probleme Abschluss der Gewinde Funktion Verfolgung wegen Unity Einschränkungen. Endlich ist es mit einem Bool und einem Koroutine getan:

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

Antwort

1

Wenn zip.ExtractAll ist die Haupt Thread oder verursacht Schluckauf zu blockieren, in einem neuen Thread oder ThreadPool verwenden. Irgendwelche von diesen sollten Ihr Problem beheben. Coroutine wird Ihnen in diesem Fall nicht helfen, es sei denn, die von Ihnen verwendete Zipping-API wurde speziell für die Zusammenarbeit mit der Coroutine von Unity entwickelt.

Fixing dies mit ThreadPool:

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

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

Beachten Sie, dass Unity-Funktion von einem anderen Thread nicht aufrufen können. Zum Beispiel wird die obige ExtractFile-Funktion in einem anderen Thread aufgerufen, und Sie erhalten eine Ausnahme, wenn Sie versuchen, die Unity-API in dieser Funktion zu verwenden. Unter here erfahren Sie, wie Sie die Unity-API in einem anderen Thread verwenden können.

+0

Danke, ist es möglich, einen Rückruf im Haupt-Thread am Ende der Extraktion auszulösen, um Einheit zu sagen, es kann seinen Prozess fortsetzen? – FLX

+0

Problem gelöst, danke – FLX

+0

Ich sehe, was Sie in Ihrer Bearbeitung getan haben. Du musst das nicht tun. Bitte lesen Sie meine Antwort erneut mit dem angegebenen Link. Nach 'zip.ExtractAll' hätten Sie' UnityThread.executeInUpdate() => { yourCallBackFunction() }); 'Das ist es. – Programmer

Verwandte Themen