microsoft.public.es.dotnet.vb
[Top] [All Lists]

Re: Aplicacion se queda como colgada cuando se ejecuta proceso grande

Subject: Re: Aplicacion se queda como colgada cuando se ejecuta proceso grande
From: SoftJaén
Date: Wed, 6 Feb 2008 15:28:28 +0100
Newsgroups: microsoft.public.es.dotnet.vb

"Jamaf" escribió:

El problema es que cuando la grilla tiene demasiados registros y hago
click en el boton de exportar a Excel, el proceso hace que la
aplicacion parezca que se colgo cuando en realidad esta funcionando
correcatmente solo que le toma tiempo exportar los datos. Luego de un
tiempo carga el execl y todo vuelve a la normalidad.

Hola, Aldo:

No nos has indicado el proceso que ejecutas para exportar a Excel, aunque me
imagino que lo harás utilizando la propia biblioteca de Excel. Si se toma
bastante tiempo en exportar los datos, lo mismo estás recorriendo una a una
las filas existentes en el control DataGridView.

Hay otras maneras más eficaces para llevar a efecto una importación o
exportación de datos a Excel, las cuales pasan por utilizar el ISAM de Excel
que nos proporciona el motor Microsoft Jet.

En el siguiente enlace encontrarás un artículo que en su día escribí para
Visual Basic 6.0, y donde la teoría sigue estando vigente; eso sí, los
ejemplos los tendrás que adaptar para ejecutarlos con Visual Basic .net:

Trabajar con ADO, DAO y Excel
http://mvp-access.com/softjaen/articulos/excel/ado_dao_excel.htm

Existe alguna manera de ejecutar este proceso sin que aparente
colgarse la aplicacion y se pueda realizar otras operaciones
paralelamente. Lei algo de Hilos pero no se como implementarlo.

Si utilizas Visual Basic 2005, puedes ejecutar operaciones en segundo plano
utilizando el control «BackgroundWorker».

Imagina que tienes el siguiente procedimiento, que es el que utilizas para
exportar a Excel:

Private Sub ExportarExcel()

       ' Aquí se ejecutaría el código fuente
       '
       ...

       ' Si se ha solicitado la cancelación de la operación, abandonamos
       ' el procedimiento-
       '
       If BackgroundWorker1.CancellationPending = True Then Return

   Next

End Sub

En el botón de inicio del proceso, escribirías lo siguiente:

Private Sub Button1_Click( ...) Handles Button1.Click

   If Not Me.BackgroundWorker1.IsBusy Then
       ' Si no se está efectuando una operación
       ' asíncrona, ejecuto la acción solicitada.
       '
       With BackgroundWorker1
           .WorkerSupportsCancellation = True
           .RunWorkerAsync()
       End With
   End If

End Sub

Y en el evento «DoWork» del control «BackgroundWorker» llamarías al
procedimiento que deseas ejecutar:

Private Sub BackgroundWorker1_DoWork(...) Handles BackgroundWorker1.DoWork
   ExportarExcel()
End Sub

Por último, cancelarías la operación en un segundo botón de la siguiente
manera:

Private Sub Button2_Click(...) Handles Button2.Click
   Me.BackgroundWorker1.CancelAsync()
End Sub

Para más información, consulta dicho control en la ayuda de Visual Studio,
donde también encontrarás el tutorial «Implementar un formulario que utiliza
una operación en segundo plano».

Un saludo

--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.


<Prev in Thread] Current Thread [Next in Thread>