Thread e SQL

domenica 08 giugno 2014 - 17.04
Tag Elenco Tags  C#  |  .NET 2.0  |  .NET 3.0  |  .NET 3.5  |  .NET 4.0  |  Windows Server 2008 R2  |  Windows Server 2008  |  Windows Server 2003  |  Windows Server 2000  |  Windows 7  |  Windows Vista  |  Windows XP  |  Visual Studio 2010  |  SQL Server 2008 R2  |  MySQL 5.5  |  MySQL 5.1  |  Access (.mdb)  |  Office 2010  |  Office 2007  |  Internet explorer 8.0  |  Internet Explorer 7.0  |  Chrome  |  Javascript  |  Powershell  |  CSS 2.1  |  HTML 5  |  Crystal Reports 8.5

AlexCiv Profilo | Newbie

Ciao a tutti,
ho creato un piccolo programma winform che avvia 5 Thread simultanei
Ogni Thread ha un timer che esegue delle query su SQL ogni 2 min circa.

Il tutto funziona ma se lo lascio in esecuzione per due giorni mi trovo il programma in crash senza tanti messaggi di debug.
Ho cercato di gestire il tutto con dei try catch ma nada..

Per gestire le query utilizzo una mia classe che continuo a richiamare, mi viene un dubbio che vado a saturare la memoria.

che mi consigliare per fare un debug sul problema?

grazie

Alessandro C.

0v3rCl0ck Profilo | Guru

>Ciao a tutti,

Ciao!

>ho creato un piccolo programma winform che avvia 5 Thread simultanei
>Ogni Thread ha un timer che esegue delle query su SQL ogni 2
>min circa.

Intanto se hai bisogno di eseguire la query in background, sappi che il System.Timers.Timer e il System.Threading.Timer, già eseguono la callback in un thread separato rispetto a quello UI:

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

http://www.codeproject.com/Articles/167365/All-about-NET-Timers-A-Comparison

quindi non hai bisogno di creare a tua volta un altro thread, quello che esegui nella callback è già in esecuzione su un altro thread, a meno che non utilizzi un System.Windows.Forms o un DispatcherTimer (WPF)

>
>Il tutto funziona ma se lo lascio in esecuzione per due giorni
>mi trovo il programma in crash senza tanti messaggi di debug.
>Ho cercato di gestire il tutto con dei try catch ma nada..
>
>Per gestire le query utilizzo una mia classe che continuo a richiamare,
>mi viene un dubbio che vado a saturare la memoria.
>
>che mi consigliare per fare un debug sul problema?

La prima cosa che mi viene in mente è proprio il fatto del multi-threading, cioè non puoi assolutamente eseguire codice che interagisce con la UI da un thread differente da quello della UI, e quindi se ad esempio nella callback di un Timers.Timer o Threading.Timer, esegui una modifica ad una textbox, miaTextbox.text = "pippo", questo provoca un eccezione che fa crashare l'applicazione e che appunto non puoi intercettare con un try-catch, perchè hai fatto una cosa troppo grave e l'applicazione non può che essere killata. Al massimo puoi forse intercettare questa eccezione con un handler globale applicativo, che winforms e wpf hanno (mi ricordo quello di wpf Application.Current.DispatcherUnhandledException ma c'è anche l'alterego winforms), per cui puoi evitare di fare franare la tua applicazione intercettando l'eccezione, e bloccando la propagazione, ma ad ogni modo ti ritroveresti con un applicazione in uno stato instabile!

Quindi se stai toccando la UI da un thread non ui, una soluzione è utilizzare un Windows.Forms.Timer (o DispatcherTimer), e se stai compilando in .net 4.5, puoi sfruttare l'async/await, per facilitarti il compito di chiamare il db in un thread a parte, e quando a finito ritornare sul thread della UI.

>
>grazie
>
>Alessandro C.

di niente!
Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5