DotNetZip congelando mi aplicación?

            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");
            }

Cuando ejecuto el botón descomprimir 1_Click () mi aplicación se congela. Soy nuevo en C # y no estoy seguro de cómo solucionarlo, ¿alguien puede ayudarme?

preguntado el 08 de enero de 11 a las 15:01

3 Respuestas

Las operaciones de bloqueo de larga ejecución no deben ejecutarse en el hilo principal de la interfaz de usuario, ya que, como puede ver, la interfaz de usuario se congelará.

Considera usar una FondoTrabajador para hacer el trabajo en un hilo separado.

Hay un buen resumen Aquí.

Informe el progreso a la interfaz de usuario manejando el evento ProgressChanged y llamando a backgroundWorker.ReportProgress (), en lugar de actualizar directamente label2.Text desde allí.

es decir, desde el interior de su método zip_ExtractProgress, llame a backgroundWorker.ReportProgress

Respondido el 08 de enero de 11 a las 18:01

Intenté usar el trabajador en segundo plano, pero seguía diciendo que mis hilos no eran seguros. ¿Cómo puedo contrarrestar eso? Leo esto: msdn.microsoft.com/en-us/library/ms171728(v=VS.100).aspx pero no me estaba funcionando. Debo haberlo estado haciendo mal. - Kyle

Probablemente estaba actualizando la interfaz de usuario directamente desde el interior de su método de gestión de eventos DoWork. En su lugar, actualice su interfaz de usuario desde dentro de un método conectado a ProgressChanged e informe el progreso utilizando backgroundWorker.ReportProgress (). Puede pasar cualquier objeto que necesite de su método de trabajo a ProgressChanged. - tomfanning

 label3.Text = e.CurrentEntry.FileName;
 label3.Update();

El método Update () asegura que la etiqueta esté pintada, mostrando ahora la propiedad Text que asignó. Sin él, la pintura no ocurre hasta que el código de descompresión deja de ejecutarse y su programa vuelve a estar inactivo. También conocido como 'bombear el bucle de mensajes'. Llamar a Update () es solo una solución parcial, su ventana aún está catatónica y no responderá a los clics del mouse, por ejemplo. Si tarda más de un par de segundos, Windows muestra la ventana fantasma "No responde".

Obtenga algo de experiencia con la codificación en C #, luego aborde los subprocesos con la clase BackgroundWorker.

Respondido el 08 de enero de 11 a las 18:01

Realmente no creo que este sea un buen consejo, no es la forma correcta de hacerlo. - tomfanning

Resuelve el problema del OP, haciéndolo teniendo en cuenta que acaba de comenzar en C #. Hacer bien el BGW no es una tarea para principiantes, tiene demasiados escollos. "Obtener algo de experiencia" es un buen consejo, en mi opinión. - Hans Passant

Forma más sencilla: ejecute el método de descomprimir utilizando un FondoTrabajador. Asegúrese de modificar los controles de la GUI solo en el hilo principal de la GUI, utilizando Invoke.

Respondido el 08 de enero de 11 a las 18:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.