Foros del Web » Programación para mayores de 30 ;) » .NET »

Ayuda con procesos

Estas en el tema de Ayuda con procesos en el foro de .NET en Foros del Web. Hola. Vereis, estoy desarrollando un proyecto en VS .net y tengo el siguiente problema. Una parte de la aplicación hace que exporte el contenido de ...
  #1 (permalink)  
Antiguo 07/03/2010, 11:57
 
Fecha de Ingreso: marzo-2010
Mensajes: 191
Antigüedad: 14 años, 2 meses
Puntos: 3
Pregunta Ayuda con procesos

Hola.

Vereis, estoy desarrollando un proyecto en VS .net y tengo el siguiente problema.

Una parte de la aplicación hace que exporte el contenido de un datagridview a excel. La exportación funciona pero cuando cierro el excel, el proceso "EXCEL.EXE" se queda en memoria.

Y eso es un problema ya que si exportamos 8 veces, son 8 procesos "EXCEL.EXE" que estan en memoria, con la correspondiente bajada de rendimiento del ordenador.

En la aplicación he hecho lo siguiente:

objeto_excel = objeto("excel.application")
objeto_libro = objeto_excel.workbook.open("ruta")

despues de ejecutar codigo para que se exporte hago:

objeto_libro.visible=true (para que abra el excel con los datos exportados)

luego pues termino con los objetos:

objeto_excel = nothing
objeto_libro = nothing

Una de las opciones que ayer me planteé era con un system.diagnostics.process coger todos los procesos "EXCEL" y matarlos con un process.kill() pero claro, eso cerraría todos los excel. Y si el cliente tiene excel abiertos que no son de la aplicación se cerrarían.

También he probado hacer:

objeto_excel.quit()

Pero nada, el proceso sigue.

Se entiende??

Saludos
  #2 (permalink)  
Antiguo 07/03/2010, 12:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda con procesos

Es un problema recurrente. Los objetos COM no son dominio de la aplicación, y deben ser liberados de otro modo.
Debes usar esto:
Código vb.net:
Ver original
  1. System.Runtime.InteropServices.Marshal.ReleaseComObject(objetoExcelAppl)
Para usarlo, debes agregar la referencia System.Runtime.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 07/03/2010, 13:42
 
Fecha de Ingreso: marzo-2010
Mensajes: 191
Antigüedad: 14 años, 2 meses
Puntos: 3
De acuerdo Respuesta: Ayuda con procesos

Es raro porqué ahora cuando ejecutaba y miraba el administrador de tareas el EXCEL.EXE ya no se quedaba ejecutandose :S

Bueno, de todos modos ya leí que había problemas con los objetos COM y he agregado la linea, así que ya me quedo más tranquilo.

Gracias Crack!

Saludos
  #4 (permalink)  
Antiguo 07/03/2010, 15:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda con procesos

Por nada.
¡No tienes ni idea de los problemas que me causó Excel hasta que encontré la documentación de este tema!
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 08/03/2010, 15:54
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Respuesta: Ayuda con procesos

Personalmente lo que hago es crear un componente para trabajar con Excel y en esa clase heredo de IDisposable para que en el método Dispose haga la liberación de objetos de esta forma:

Código:
public void Dispose()
        {
            if (oApp != null)
            {
                oApp.Workbooks.Close();
                oApp.Quit();
            }

            if (oRange != null) Marshal.ReleaseComObject(oRange);
            if (oWorksheet != null) Marshal.ReleaseComObject(oWorksheet);
            if (oWorkbook != null) Marshal.ReleaseComObject(oWorkbook);
            if (oApp != null) Marshal.ReleaseComObject(oApp);

            oWorksheet = null;
            oWorkbook = null;
            oApp = null;
            
            GC.Collect();
        }
Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net

Etiquetas: basic, excel, exportar, visual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:40.