2017-04-10 12 views
3

작업에서 압축 해제를 실행하는 방법이 있습니다. 이제 작업 취소 기능을 원합니다. 내가 전화 할 때 그러나 Cancel() 방법의 모든 것을 즉시 중단 할 것 영원히 while 실행 : 나는 args.Cancel = _cancelExtraction;에 브레이크 포인트를 설정 한DotNetZip 작업에서 추출 취소

public class OsiSourceZip 
{ 
    private const string ZipPassword = "******"; 

    private bool _extractionDone; 
    private bool _cancelExtraction; 

    public async Task Extract(string sourceFile, string extractionDir) 
    { 
     Task extraction = Task.Run(() => 
     { 
      using (ZipFile zipf = ZipFile.Read(sourceFile)) 
      { 
       zipf.ExtractProgress += delegate(object sender, ExtractProgressEventArgs args) 
       { 
        args.Cancel = _cancelExtraction; 
        RaiseExtractionProgressUpdate(args); 
       }; 
       zipf.Password = ZipPassword; 
       zipf.Encryption = EncryptionAlgorithm.WinZipAes256; 
       zipf.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently; 
       zipf.ExtractAll(extractionDir); 
      } 
     }); 

     await extraction; 
     _extractionDone = true; 
     RaiseSourceInstallationCompleted(); 
    } 

    public void Cancel() 
    { 
     _cancelExtraction = true; 
     while (!_extractionDone) 
     { 
      Thread.Sleep(500); 
     } 
    } 
} 

하지만 이벤트는 즉시 Cancel() 메소드가 호출 될 때 더 이상 해고되지 않습니다.

답변

0

나는 이것에 대한 해결책을 찾았습니다. 기본적으로 내 Cancel 메서드를 제거하고 dotnetzip 프레임 워크가 원하는대로 처리합니다. 진행 이벤트에서.

Form이 닫히면 작업을 취소하고 싶다고 가정 해 봅시다. FormClosing 이벤트를 캡처하고 닫기 절차를 취소하고 닫기 요청을 기억하십시오. 다음 번에 진행 이벤트가 발생, 나는 이벤트 인수로하여 cancel 속성을 설정하고 completed 이벤트에 자신을 Form을 닫습니다

public partial class MainForm : Form 
{ 
    private bool _closeRequested; 

    private void OnSourceInstallationCompleted(object sender, EventArgs e) 
    { 
     if (_closeRequested) { this.Close(); }    
    } 

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (!_closeRequested) 
     { 
      _closeRequested = true; 
      e.Cancel = true; 
     } 
    } 

    private void OnExtractionProgressUpdate(object sender, ExtractProgressEventArgs e) 
    { 
     e.Cancel = _closeRequested; 
    } 
} 

을 나는 오히려 추한 생각하지만 ....

를 작동