C# DotNetZip在任务中取消提取
我有一个在任务中执行zip提取的方法。现在我想要取消操作的能力。但是当我调用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
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;
}
}
我觉得它很难看,但它很管用