DotNetZip заморозил мое приложение? - PullRequest
1 голос
/ 08 января 2011
            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");
            }

Когда я выполняю распаковку button1_Click (), мое приложение зависает. Я новичок в C # и не совсем уверен, как это исправить, может кто-нибудь мне помочь?

Ответы [ 3 ]

3 голосов
/ 08 января 2011

Длительные операции блокировки не должны выполняться в основном потоке пользовательского интерфейса, поскольку, как вы можете видеть, пользовательский интерфейс зависнет.

Попробуйте использовать BackgroundWorker для выполнения работы в отдельном потоке.

Вот хорошее резюме здесь .

Сообщать о прогрессе обратно в пользовательский интерфейс, обрабатывая событие ProgressChanged и вызывая backgroundWorker.ReportProgress (), вместо непосредственного обновления label2.Text изнутри.

т.е. внутри вашего метода zip_ExtractProgress вызовите backgroundWorker.ReportProgress

2 голосов
/ 08 января 2011
 label3.Text = e.CurrentEntry.FileName;
 label3.Update();

Метод Update () гарантирует, что метка будет закрашена, и теперь отображает назначенное вами свойство Text. Без этого рисование не происходит до тех пор, пока разархивированный код не перестанет работать и ваша программа снова не будет работать. В противном случае известен как «прокачка цикла сообщений». Вызов Update () - это только частичное исправление, ваше окно все еще кататонично и, например, не реагирует на щелчки мышью. Если это займет больше пары секунд, Windows отобразит окно-призрак «Не отвечает».

Получите некоторый опыт работы с кодированием в C #, а затем займитесь многопоточностью с помощью класса BackgroundWorker.

1 голос
/ 08 января 2011

Самый простой способ: выполнить метод распаковки, используя BackgroundWorker . Обязательно изменяйте элементы управления графическим интерфейсом только в главном потоке графического интерфейса, используя Invoke.

...