Multithread n oggetti Background Worker.

martedì 22 luglio 2008 - 18.18

Barabas Profilo | Junior Member

ho realizzato in VB.NET un'applicazione che compie una operazione lunga (lettura dati da sorgente remota) con un thread separato gestito tramite l'oggetto background worker, senza che l'interfaccia si blocchi in attesa del completamento, e funziona bene.
Era la prima volta che usavo il background worker e ne sono stato molto soddisfatto.
ora è nata l'esigenza di leggere dati da diverse sorgenti, ed il loro numero è variabile...
potrei far leggere i dati da una sorgente alla volta, usando sempre lo stesso oggetto background worker, ma ci metterei troppo tempo (parliamo di più di 12 ore!!!)
non posso creare neanche un background worker per ogni sorgente, perchè non conosco a priori quante ne saranno.
quindi avevo pensato creare a runtime n oggetti background worker ed affidare ad ognuno di loro la gestione di un thread di lettura, ma come faccio poi per utilizzare i metodi che gestiscono gli eventi DoWork, ProgressChangede RunWorkerCompleted ? Non saprei come scrivere la clausola "handles"...
es.
Private Sub XXXXXX_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles ??????????.DoWork
al posto dei punti interrogativi " La clausola Handles richiede una variabile WithEvents definita nel tipo che la contiene o in uno dei sui tipi base"...
Potete darmi qualche consiglio?
Grazie in anticipo





Barabas

rossimarko Profilo | Guru

Ciao,

devi agganciare l'evento da codice con l'istruzione AddHandler: http://msdn.microsoft.com/en-us/library/7taxzxka.aspx
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Barabas Profilo | Junior Member

Grazie mille!! Ora funziona!!
in passato avevo già usato AddHandler, ma me ne ero completamente dimenticato...
purtroppo però ho dovuto rinunciare alla progress bar per visualizzare il progredire dell'operazione, perchè dava questa eccezione:
- Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'ReintegrationProgressBar' da un thread diverso da quello da cui è stata eseguita la creazione. -
ed è anche ragionevole dato che tutti i thread lanciati modificavano l'aggiornamento della stessa progress bar...
ho sopperito con una status bar, ma non ha lo stesso effetto "scenografico"...
se ci sono suggerimenti anche per questo sono bene accetti!
grazie ancora
ciao
Barabas

rossimarko Profilo | Guru

Se vuoi aggiornare la progress devi agganciare l'evento ProgressChanged del backgroud worker e poi devi utilizzare il metodo ReportProgress all'interno della dowork.

Trovi un esempio qui:http://msdn.microsoft.com/it-it/library/waw3xexc.aspx
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Barabas Profilo | Junior Member

sì questo già l'ho fatto, e prima con un unico thread funzionava, ora che sono diversi va in eccezione...
credo che sia proprio l'accesso alla progress bar da diversi thread a dargli fastidio...
inoltre non sarebbe neanche leggibile... immagina una progress bar che rappresenta l'andamento di diversi thread contemporaneamente... sarebbe un casino...
magari ci vorrebbe qualcosa di diverso dalla progress bar, più adatto a rappresentare l'avanzamento di molteplici processi...
ma non saprei cosa...
Barabas

rossimarko Profilo | Guru

Dovresti creare n progress, oppure ti suggerisco un'altra possibilità.

Inserisci una griglia che viene popolata da una tua collection o datatable. Questa datatable conterrà una riga per ogni processo che sta girando e all'interno della riga ti salverai un identificatore che ti indica il processo e un valore numerico che ti indica lo stato di avanzamento. L'utente vedrebbe per ogni processo la percentuale di avanzamento.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Barabas Profilo | Junior Member

mmmm....la griglia forse può andare... ora ci provo
grazie
Barabas
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