Processo.

martedì 05 gennaio 2010 - 12.23

iif Profilo | Expert

Ciao a tutti, spero di essere nel form giusto.
In vb net ho creato una procedura che genera un file excel e lo visualizza.
Se lancio questa proc più volte, nel task manager vedo il processo ripetuto.
Ciò comporta un rallentamento, come posso evitarlo?
Grazie.

tonyexpo Profilo | Senior Member

ciao
puoi spiegarti meglio?
come lo lanci?
cosa vedi in TM ripetuto?

grazie
Antonio Esposito
MCTS .NET 3.5 WCF
MCTS .NET 3.5 Windows Forms
MCTS .NET 2.0 Distributed applications
MCP

dante4691 Profilo | Newbie

Ciao, se ho capito bene il tuo prog genera e fa aprire un file di calcolo, e se ne vuoi aprire uno nuovo spuntano piu processi. Piu processi rallentano il sistema, anche in modo minimo. Sempre see ho capito bene potresti a posto di aprire un nuovo programma, far si che il programma aperto generi uno altro foglio e lo apra.

iif Profilo | Expert

Scusate, forse sono stato poco chiaro.
Ho una routine in vb net che genera un file excel, il contenuto di tale file proviene da una griglia.
Se lancio questo export più volte, nel task manager mi ritrovo excel aperto tante volte e ciò mi rallenta il sistema.

freeteo Profilo | Guru

Ciao,
hai usato l'oggetto Excel.Application o qualcosa che faccia Interop con Excel?
Prova a distruggere l'oggetto chiamando il "dispose" (o qualche forma di "close") per distruggerlo...casomai prova a postare il codice che vediamo di capire cosa resta attivo...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

tonyexpo Profilo | Senior Member

Ciao

immagino che dopo aver esportato non hai esplicitamente chiuso excel:
ti faccio un esempio

//crei l'oggetto excel application usando l'interop
Dim excel as New Microsoft.Office.Interop.Excel.Application
//crei un nuovo foglio di lavoro
Dim book = excel.Workbooks.Add()
//oppure apri un template da popolare
Dim book = MsExcel.Workbooks.Open(IO.Path.Combine(My.Application.Info.DirectoryPath, "<filename>"))
//a questo punto usando il primo foglio inizi a scrivere qualcosa...
Dim sheet = excel.Worksheets(1)
Sheet.Cells(1, 1) = "ciao"
Sheet.Cells(1, 2) = "ciao"
Sheet.Cells(1, 3) = "ciao"
//eventulmente volessi stampare....
book.PrintOut()
//chiudi il foglio di lavoro
book.Close(SaveChanges:=False) //evitando un salvataggio in questo caso, o facendolo come vuoi tu
//CHIUDI EXCEL
MsExcel.Quit()
MsExcel = Nothing

Ciao
Antonio Esposito
MCTS .NET 3.5 WCF
MCTS .NET 3.5 Windows Forms
MCTS .NET 2.0 Distributed applications
MCP

iif Profilo | Expert

Se ho altri file aperti, vorrei lasciarli aperti e chiudere solo il processo che ho aperto, scusate il giro di parole.
E' possibile?

dante4691 Profilo | Newbie

Non credo sia possibile se vuoi tenere piu file aperti i processi saranno equivalenti al numero dei file, un processo per ogni file.

iif Profilo | Expert

Ogni processo ha un id univoco?

tonyexpo Profilo | Senior Member

nel momento che fai.Quit() dell'oggetto excel che vuoi, chiuderai il solo excel con cui hai aperto quel file... gli altri file si apriranno in altri processi di excel
Antonio Esposito
MCTS .NET 3.5 WCF
MCTS .NET 3.5 Windows Forms
MCTS .NET 2.0 Distributed applications
MCP

alexmed Profilo | Guru

Ciao
Prova questo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Fà un confronto tra i processi prima e dopo che lanci la modifica del file e quello nuovo (l'ultimo aperto) lo termina

Ciao

alexmed

PS per tonyexpo
Avevo già provato quel codice ma termina il processo Excell solo nel momento in cui esci dalla tua applicazione
Ciao

iif Profilo | Expert

Grazie per l'esempio, molto utile.
E' possibile terminare il processo dopo n secondi di inutilizzo?

alexmed Profilo | Guru

>Grazie per l'esempio, molto utile.
Prego
>E' possibile terminare il processo dopo n secondi di inutilizzo?
Certo! ed è già impostato per farlo, con un ritardo di 3 secondi.
Se guardi il codice ad un certo punto troverai:

System.Threading.Thread.Sleep(3000)
'fine EXCEL ---------------------

Basta cambiare il valore tra parentesi 3000 = 3 sec, 5000 = 5 sec

Ciao

alexmed
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5