Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DotNetZip在任务中取消提取_C#_Task_Dotnetzip - Fatal编程技术网

C# DotNetZip在任务中取消提取

C# DotNetZip在任务中取消提取,c#,task,dotnetzip,C#,Task,Dotnetzip,我有一个在任务中执行zip提取的方法。现在我想要取消操作的能力。但是当我调用Cancel()方法时,一切似乎立即停止,而while将永远运行: public class OsiSourceZip { private const string ZipPassword = "******"; private bool _extractionDone; private bool _cancelExtraction; public async Task Extract

我有一个在任务中执行zip提取的方法。现在我想要取消操作的能力。但是当我调用
Cancel()
方法时,一切似乎立即停止,而
while
将永远运行:

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

我在
args.Cancel=\u cancelExtraction上设置了一个断点
但是只要调用
Cancel()
方法,事件就不再被激发。

我找到了解决方法。我基本上摆脱了自己的
Cancel
方法,并按照dotnetzip框架的要求来做。在进展事件中

假设您想在
窗体关闭时取消该操作。我捕获
FormClosing
事件,取消关闭过程并记住关闭请求。下次触发进度事件时,我在事件args中设置
取消
属性,并在
完成
事件中关闭
表单
我自己:

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;
    }
}
我觉得它很难看,但它很管用