DotNetZip冻结我的申请?

时间:2011-01-08 15:23:07

标签: c# .net dotnetnuke

            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#的新手,我不确定如何解决这个问题,有人可以帮助我吗?

3 个答案:

答案 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控件。