ThreadPool e sua terminazione
historyX non è online. Ultima attività: 11/07/2008 15.27.28historyX
Inserito il: 15 aprile 2008 11.28
79 messaggi dal 23 apr 2007 Istalla Microsoft Silverlight!
Salve a tutti,
devo effettuare la copia di un grosso numero di file da un dvd al filesystem, per fare questo ho un mio oggetto Worker, il cui metodo DoCopy() mi permette di effettuare la copia di un singolo file. Per questione di ottiminazione ho deciso di inserire ogni singola chiamata in un ThreadPool, ma avrei la necessità di segnalare ogni qual volta un file venga copiata, ossia ogni qual volta uno dei thread creati muore, ho visto che la classe threadpool non offre molto per questo, essendo nuovo della programmazione ad eventi devo chiedervi qualche idea sul come risolvere questo problema.

se può servire, posto il codice:


DriverCdRom.Worker workThread = new Worker(path, file);

// istanzio la waitCllBack instance che userò per eseguire la copia
WaitCallback waitCallBack = new WaitCallback(workThread.DoCopy);

ThreadPool.QueueUserWorkItem(waitCallBack);


ed ecco la funzione DoCopy:

public void DoCopy(Object stateInfo)
{
this.file.CopyTo(this.pathCopy + this.file.Name, true);
}


ps. la classe WorkerThread è solo un contenitore scritto da me per il nome del file e il path in cui deve essere copiato.

Ciao a tutti
Sergio

Modificato da historyX il 15 aprile 2008 11.31 -
Microsoft Most Valuable Professional
RE: ThreadPool e sua terminazione
Ricciolo non è online. Ultima attività: 17/07/2008 22.50.31Ricciolo
Inserito il: 20 aprile 2008 17.20
contributi / Top Poster / Community manager / blogs.aspitalia.com / Blog / 4519 messaggi dal 26 feb 2001 Istalla Microsoft Silverlight!
Ciao,
invece di guardare quando il thread finisce semplicemente nel tuo metodo notifica la fine dell'elaborazione del file, interagendo direttamente con l'interfaccia, o sfruttando gli eventi.
Se vuoi nel framework c'è l'oggetto AsyncOperationManager che ti permette di creare un'operazione e di notificare il suo termine. Questa classe è usata anche dal BackgroundWorkerAsync perché in automatico esegue l'operazione di notifica sul thread UI delle winform (non so se hai mai provato ma tutte le operazioni UI andrebbero fatte su questo unico thread).

Detto questo, non sono molto d'accordo con la tecnica di usare più thread, perché così copi più file contemporaneamente, ma è probabile che ci metta di più rispetto al copiarne uno alla volta. Questo perché sia l'hard disk che il lettore dvd sono più performanti su settori continui da leggere o scrivere, mentre tu così obbligheresti entrambi a soddisfare diverse richieste IO contemporaneamente. Certo per gli HD ci sono altre variabili come buffer, numero dischi, frammentazione del disco ecc, ma in linea generale il discorso vale.

Ciao

Il mio blog
Homepage

Vai a:

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.


COMMUNITY
ULTIMI MESSAGGI


IN EVIDENZA
MISC
Powered by .db Forums