Query blocca l'applicazione

martedì 11 aprile 2006 - 17.18

Juwan Profilo | Junior Member

Salve ragazzi, ho un'applicazione che esegue una query molto grande ad un db, per informare l'utente che si stanno caricando i dati del db, ho inserito nel form una progressBar, che informa sullo stato dell'operazione, però il problema è che questa query, blocca per alcuni instanti l'applicazione, il form, e di conseguenza anche la progressBar1, in seguito torna tutto funzionante, ma solo quando l'operazione è stata eseguita completamente. Quindi l'utente non viene più informato dello stato dell'applicazione, e può credere che essa sia bloccata, quando invece in realtà sta solo eseguendo la query. Come posso risolvere il problema del blocco del programma?

trinity Profilo | Guru

devi utilizzare i thread per gestire + oggetti ed operazioni contemporaneamente
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alato Profilo | Newbie

faresti un esempio di codice concorrente? sarebbe alquanto utile...

trinity Profilo | Guru

se mi posti il progettino te lo modifico in base ciò che ti serve, ovviamente anche il db..
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Juwan Profilo | Junior Member

Ok però il metodo che deve essere chiamato da un altro thread, devo mano mano avere un paramentro diverso, per così poter aumentare la progressBar, come faccio a chiamare il metodo dello stesso thread, più volte?
Cmq questo è la parte di codice incriminata


progressBar.Value = 10;

metodo_query_db();

progressBar.Value = 50;

metodo2_query_db();

progressBar.Value = 100;
MessageBox.Show("Caricamento dei contenuti, effettuato", "Operazione eseguita con successo", MessageBoxButtons.OK, MessageBoxIcon.Information);
progressBar.Visible = false;

Juwan Profilo | Junior Member

Mi hanno consigliato di usare il controllo
BackgroundWorker, però mi da problemi nella chiusura del thread,
perchè mi dice che lo stato del backgroundworker, non supporta la
cancellazione. Posto qui il codice per farmi capire meglio.

backgroundWorker1.RunWorkerAsync(progressBar1.Value =
10);
backgroundWorker1.CancelAsync();
chiamata_primo_metodo()
backgroundWorker1.RunWorkerAsync(progressBar1.Value =
50);
backgroundWorker1.CancelAsync();
chiamata_secondo_metodo()
backgroundWorker1.RunWorkerAsync(progressBar1.Value =
100);
backgroundWorker1.CancelAsync();


trinity Profilo | Guru

dal codice che hai postato ti esegue tutto ma la toolbar non si vede muoversi, giusto?
intanto che io controllo togli il codice che si trova nelle sub_routine e inseriscilo direttamente nel codice delle progress e prova...cmq sarebbe meglio utilizzare il metodo invoke per i thread, te utilizzi vs 2003 o 2005?per sapere su qualche compilatore scrivere il codice e provare...

Ciao

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Juwan Profilo | Junior Member

No, il problema è che che la progressbar si muove, ma viene segnalato un errore sul CancelAsync, mi dice che lo stato del backgroundworker, non supporta la cancellazione. Cmq sto usando la visual studio 2005

trinity Profilo | Guru

perchè devi utilizzare il backgroundWorker?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Juwan Profilo | Junior Member

Perchè mi avevano consigliato quel controllo per gestire più thread, tu invece cosa mi consigli, per risolvere il mio problema?

trinity Profilo | Guru

Tu puoi gestire quanti thread vuoi ma per gestire gli oggetti all'interno dei thread devi utilizzare l'accesso multithread e devono essere di tipo thread Safe..

leggi qui:
http://msdn2.microsoft.com/en-us/library/ms171728.aspx

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Juwan Profilo | Junior Member

Io però tramite quest'altro thread, devo poter gestire l'avanzamento della progressBar, e siccome tale controllo viene creato da un altro thread, viene segnalato errore :-(

trinity Profilo | Guru

se puoi perchè non mi posti il progetto e te lo controllo? Dovrei esaminarlo per vedere dove nasce l'errore
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Juwan Profilo | Junior Member

Ti ringrazio molto della tua grande disponibilità, domani mattima ti manderò il progetto, a quale indirizzo email posso mandartelo?

trinity Profilo | Guru

Fabio@wondernet.biz
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

trinity Profilo | Guru

Pensavo che fosse codice vb net perché scrivo sotto con il linguaggio vb, comunque non potrei ugualmente fare una prova perché avrei bisogno dell'intero progetto e gestire i processi con il Debug e vedere dove nasce il blocco, comunque ti consiglio di inserire la gestione dell'avanzamento della Progressbar nelle rispettive Routine Metodo1 e Metodo2 e non richiamare il processo dall'esterno. Prova così, mi spiace tantissimo che alla fine non ti posso essere di grande aiuto.

Ciao e buon lavoro
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Juwan Profilo | Junior Member

Ti ringrazio lo stesso per il tuo aiuto, comunque se metto l'avanzamento della progress bar dove dici tu, non penso che il problema venga risolto, perchè fanno sempre parte dello stesso thread. Invece per quanto riguarda il codice, se usi SharpDevelop, hai la possibilità di convertire codice C# in vb net e viceversa

trinity Profilo | Guru

Dove posso trovar elo sharpdevelp?
Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

Juwan Profilo | Junior Member

A questo indirizzo http://www.icsharpcode.net/OpenSource/SD/
Ovviamente SharpDevelop oltre ad avere la possibilità di convertire il codice, è da considerarsi un vero e proprio ambiente di sviluppo free per il dot net, non ha ancora tutte le funzionalità della visual studio, ma è comunque un buon ambiente
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5