Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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冻结我的应用程序? string desktop=Environment.GetFolderPath(Environment.SpecialFolder.desktop); 公共void解压(字符串zFile) { Ionic.Zip.ZipFile Zip=Ionic.Zip.ZipFile.Read(zFile); zip.ExtractProgress+=新事件处理程序(zip_ExtractProgress); zip.ExtractAll(桌面+“\\cache”,ExtractExistingFileAction.OverwriteSilently); zip.Dispose(); zip=null; } void zip_ExtractProgress(对象发送方,ExtractProgressEventArgs e) { if(e.EventType==ZipProgressEventType.Extracting\u entrybytesswrited) { label2.Text=“调试:”+((e.EntriesExtracted)); } else if(e.EventType==ZipProgressEventType.Extracting\u BeforeExtractEntry) { label3.Text=e.CurrentEntry.FileName; } } 私有无效按钮1\u单击(对象发送者,事件参数e) { 解压(桌面+“\\cache.zip”); }_C#_.net_Dotnetnuke - Fatal编程技术网

C# DotNetZip冻结我的应用程序? string desktop=Environment.GetFolderPath(Environment.SpecialFolder.desktop); 公共void解压(字符串zFile) { Ionic.Zip.ZipFile Zip=Ionic.Zip.ZipFile.Read(zFile); zip.ExtractProgress+=新事件处理程序(zip_ExtractProgress); zip.ExtractAll(桌面+“\\cache”,ExtractExistingFileAction.OverwriteSilently); zip.Dispose(); zip=null; } void zip_ExtractProgress(对象发送方,ExtractProgressEventArgs e) { if(e.EventType==ZipProgressEventType.Extracting\u entrybytesswrited) { label2.Text=“调试:”+((e.EntriesExtracted)); } else if(e.EventType==ZipProgressEventType.Extracting\u BeforeExtractEntry) { label3.Text=e.CurrentEntry.FileName; } } 私有无效按钮1\u单击(对象发送者,事件参数e) { 解压(桌面+“\\cache.zip”); }

C# DotNetZip冻结我的应用程序? string desktop=Environment.GetFolderPath(Environment.SpecialFolder.desktop); 公共void解压(字符串zFile) { Ionic.Zip.ZipFile Zip=Ionic.Zip.ZipFile.Read(zFile); zip.ExtractProgress+=新事件处理程序(zip_ExtractProgress); zip.ExtractAll(桌面+“\\cache”,ExtractExistingFileAction.OverwriteSilently); zip.Dispose(); zip=null; } void zip_ExtractProgress(对象发送方,ExtractProgressEventArgs e) { if(e.EventType==ZipProgressEventType.Extracting\u entrybytesswrited) { label2.Text=“调试:”+((e.EntriesExtracted)); } else if(e.EventType==ZipProgressEventType.Extracting\u BeforeExtractEntry) { label3.Text=e.CurrentEntry.FileName; } } 私有无效按钮1\u单击(对象发送者,事件参数e) { 解压(桌面+“\\cache.zip”); },c#,.net,dotnetnuke,C#,.net,Dotnetnuke,当我执行解压按钮1\u Click()时,我的应用程序冻结。我是C#新手,我真的不知道如何解决这个问题,有人能帮我吗?长时间运行的阻塞操作不应该在主UI线程上运行,因为您可以看到UI将冻结 考虑在单独的线程上使用 有一个很好的总结 通过处理ProgressChanged事件并调用backgroundWorker.ReportProgress(),而不是从内部直接更新label2.Text,将进度报告回UI i、 e.从zip_ExtractProgress方法内部,调用backgroundWor

当我执行解压按钮1\u Click()时,我的应用程序冻结。我是C#新手,我真的不知道如何解决这个问题,有人能帮我吗?

长时间运行的阻塞操作不应该在主UI线程上运行,因为您可以看到UI将冻结

考虑在单独的线程上使用

有一个很好的总结

通过处理ProgressChanged事件并调用backgroundWorker.ReportProgress(),而不是从内部直接更新label2.Text,将进度报告回UI


i、 e.从zip_ExtractProgress方法内部,调用backgroundWorker.ReportProgress不应在主UI线程上运行长时间运行的阻塞操作,因为您可以看到UI将冻结

考虑在单独的线程上使用

有一个很好的总结

通过处理ProgressChanged事件并调用backgroundWorker.ReportProgress(),而不是从内部直接更新label2.Text,将进度报告回UI


i、 e.从zip_ExtractProgress方法内部,调用backgroundWorker.ReportProgress最简单的方法:使用。确保使用Invoke仅在主GUI线程上修改GUI控件。

最简单的方法:使用。确保使用Invoke仅在主GUI线程上修改GUI控件

            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");
            }
Update()方法确保绘制标签,现在显示指定的文本属性。如果没有它,直到解压代码停止运行并且程序再次空闲时,才会进行绘制。否则称为“泵送消息循环”。调用Update()只是部分修复,例如,您的窗口仍然处于紧张状态,不会响应鼠标单击。如果时间超过几秒钟,Windows将显示“无响应”重影窗口

获得一些用C#编写代码的经验,然后使用BackgroundWorker类处理线程

Update()方法确保绘制标签,现在显示指定的文本属性。如果没有它,直到解压代码停止运行并且程序再次空闲时,才会进行绘制。否则称为“泵送消息循环”。调用Update()只是部分修复,例如,您的窗口仍然处于紧张状态,不会响应鼠标单击。如果时间超过几秒钟,Windows将显示“无响应”重影窗口


在C#中获得一些编码经验,然后使用BackgroundWorker类处理线程。

我尝试使用后台工作程序,但它一直说我的线程不安全。我该如何应对?我读到了这篇文章:但这对我来说并不合适。我一定是做错了。您可能是直接从DoWork事件处理程序方法内部更新UI。而是从连接到ProgressChanged的方法内部更新UI,并使用backgroundWorker.ReportProgress()报告进度。您可以将所需的任何对象从worker方法传递到ProgressChanged。我尝试使用后台worker,但它一直说我的线程不安全。我该如何应对?我读到了这篇文章:但这对我来说并不合适。我一定是做错了。您可能是直接从DoWork事件处理程序方法内部更新UI。而是从连接到ProgressChanged的方法内部更新UI,并使用backgroundWorker.ReportProgress()报告进度。您可以将所需的任何对象从worker方法传递到ProgressChanged。我真的不认为这是一个好的建议-这样做非常不正确。它解决了OP的问题,这样做时要记住他刚刚开始使用C。正确使用BGW不是一项初学者任务,它有太多的陷阱。“获得一些经验”是一个很好的建议,我真的不认为这是一个很好的建议——这不是一个正确的方法。它解决了OP的问题,这样做的时候要记住他才刚开始学习C。正确使用BGW不是一项初学者任务,它有太多的陷阱。“获得一些经验”是个好建议,国际海事组织。
 label3.Text = e.CurrentEntry.FileName;
 label3.Update();