2017-04-09 1 views
0

Ionic.Zip.dll을 사용하여 zip 파일을 추출합니다.DotNetZIp 블로킹 통합

그것은 zip.ExtractAll(zipPath, ExtractExistingFileAction.OverwriteSilently);

잘 작동하지만 아카이브가 UI가 응답 (버튼 효과 등)를 추출된다. 이렇게 나는 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

zip.ExtractAll 경우 새로운 Thread 또는 ThreadPool에서 사용, 주요 Thread을 차단하거나 딸꾹질을 일으키는 것입니다. 이 중 하나라도 문제를 해결해야합니다. 코 루틴은 사용하는 압축 API가 Unity의 코 루틴과 함께 작동하도록 특별히 설계되지 않은 이상이 경우에는 도움이되지 않습니다. 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 (() => { yourCallBackFunction() }}) 할 수 있습니다. – Programmer