string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
public void unzip(String zFile)
{
Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(zFile);
zip.ExtractProgress += new EventHandler<ExtractProgressEventArgs>(zip_ExtractProgress);
zip.ExtractAll(desktop + "\\cache", ExtractExistingFileAction.OverwriteSilently);
zip.Dispose();
zip = null;
}
void zip_ExtractProgress(object sender, ExtractProgressEventArgs e)
{
if (e.EventType == ZipProgressEventType.Extracting_EntryBytesWritten)
{
label2.Text = "debug: " + ((e.EntriesExtracted));
}
else if (e.EventType == ZipProgressEventType.Extracting_BeforeExtractEntry)
{
label3.Text = e.CurrentEntry.FileName;
}
}
private void button1_Click(object sender, EventArgs e)
{
unzip(desktop + "\\cache.zip");
}
当我执行解压缩按钮1_Click()时,我的应用程序冻结了。我是C#的新手,我不确定如何解决这个问题,有人可以帮助我吗?
答案 0 :(得分:3)
长时间运行的阻止操作不应该在主UI线程上运行,因为你可以看到UI会冻结。
考虑使用BackgroundWorker在单独的线程上完成工作。
有一个很好的总结here。
通过处理ProgressChanged事件并调用backgroundWorker.ReportProgress()将进度报告回UI,而不是直接从内部更新label2.Text。
即。从您的zip_ExtractProgress方法中,调用backgroundWorker.ReportProgress
答案 1 :(得分:2)
label3.Text = e.CurrentEntry.FileName;
label3.Update();
Update()方法确保绘制标签,现在显示您指定的Text属性。没有它,直到解压缩代码停止运行并且程序再次空闲时才会发生绘画。否则称为“抽取消息循环”。调用Update()只是部分修复,您的窗口仍然是紧张性的,并且不会响应鼠标点击。如果花费的时间超过几秒钟,Windows将显示“未响应”重影窗口。
获得一些使用C#编码的经验,然后使用BackgroundWorker类处理线程。
答案 2 :(得分:1)
最简单的方法:使用BackgroundWorker执行解压缩方法。请务必使用Invoke修改主GUI线程上的GUI控件。