Domanda sulla gestione dei threand con i delegate e il metodo invoke

venerdì 01 febbraio 2008 - 00.13

trinity Profilo | Guru

salve ragazzi vorrei porvi una domanda per chiarirmi le idee.

Prima di tutto vedete questo codice (funziona)
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

questo esempio serve ad aumentare il valore della progressbar.
Ma mettiamo il caso in cui la progressbar deve aumentare in base ad una serie di operazioni che avvengono in un ciclo for, ma ogni volta che iniziano queste operazioni alla progressbar si deve settare il valore "value" deve essere azzerato e deve essere settato anche il valore "maximum".
Pertanto la mia domanda è la seguente, c'è la possibilità di integrare il codice che io ho scritto in alto oppure è giusto e corretto avere n delegate ed invocarle anche per la semplice operazione di azzeramento della progressbar o per settare il suo valore maximum.
Ovviamente tutto ciò per evitare di incappare nel famoso errore: “Operazione cross-thread non valida: è stato eseguito l’accesso al controllo ‘progressBar1′ da un thread diverso da quello da cui è stata eseguita la creazione.”

Attendo risposte e consigli...

P.S. ho provato l'oggetto BackGroundWorker e onestamente per le operazione che devo eseguire nel ciclo for (avviare stored, ricavare dati da un db ecc,ecc) mi sembra un oggetto poco stabile...

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

AndreaKpr Profilo | Senior Member


Ciao. Il codice che hai scritto è corretto...
A suo tempo ho avuto anche io un problema simile al tuo.
L' ho risolto creado un delegato generico a cui passando dei parametri stringa settavo i valori appropriati.

Tipo cosi ...


delegate void SetValueCallbackPrgBarCom (string Tipo, int NewValue); private void TcSetProgBarComSet(string UpbTipo, int UpbValue) { if (this.InvokeRequired) { SetValueCallbackPrgBarCom UpbDb = new SetValueCallbackPrgBarCom(TcSetProgBarComSet); this.Invoke(UpbDb, new object[] { UpbTipo, UpbValue }); } else { if (UpbTipo == "Min") this.TcPrgBarCom.Minimum = UpbValue; if (UpbTipo == "Max") this.TcPrgBarCom.Maximum = UpbValue; if (UpbTipo == "Val") this.TcPrgBarCom.Value = UpbValue; } } private void Cmd_Click(object sender, EventArgs e) { TcSetProgBarComSet("Min", 0); TcSetProgBarComSet("Max", 100); TcSetProgBarComSet("Val", 0); for (int I = 0; I < 100; I++) TcSetProgBarComSet("Val", I); }

Ovviamente gestito in un Thread a parte ...

Il codice è in c#, ma è facilemte traducibile in Vb.Net

Ciao Ciao

trinity Profilo | Guru

Grazie e senti visto che ci sto ti chiedo questo e se dovessi caricare dei dati in una listview?

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

AndreaKpr Profilo | Senior Member


Io lo farei del tutto simile...
Per ogni operazione richiama sempre lo stesso metodo

che carica i dati (pasando datatable o sql)
che elimina reghe
ecc ecc ecc

Riciao!
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