[C#]Copia Files grosse dimensioni blocca l'applicazione

martedì 24 aprile 2012 - 11.07
Tag Elenco Tags  C#

HardTekCrash Profilo | Newbie

Salve a tutti raga :)
Ho quasi finito il programma per fare Backup.
Ho solo un problema...quando copio files di grosse dimensione l'applicazione rimane impallata.
Il software in questione copia tutti i files che trova in una determinata cartella,quindi con un foreach
foreach (string fls in Directory.GetFiles(SourcePath))
utilizzo la funzione per copiare,quindi copia ogni files singolarmente e inserisce dentro un ListView il percorso del file che copia.
Ho inserito anche una progressbar però il problema è questo:
Quando parte la copia il programma rimane impallato (quindi non da la lista dei files che sta copiando uno a uno e la progress bar non aumenta il value) ma a fine copia (con il software impallato) l'applicazione si sblocca e mi da già la lista con tutti i files e la progressbar al 100%.
Vorrei capire se c'è una soluzione per non tenere impallato l'applicazione e che aggiorni sulla copia dei files man mano che questi vengono rilevati e copiati.
Grazie a tutti anticipatamente,
vi saluto e vi auguro buona giornata a tutti.

massimo.missaglia Profilo | Newbie

Ciao,
utilizza un metodo asincrono.

http://msdn.microsoft.com/it-it/library/2e08f6yc(v=vs.80).aspx

Massimo Missaglia
-------------------------------
www.MassimoMissaglia.com

HardTekCrash Profilo | Newbie

Grazie Massimo, sei sempre in mio soccorso :)
Però il problema è che sto guardando il metodo Async però non mi corrisponde con quello che è spiegato li.
Credo sia per il fatto che io sto utilizzando il FrameWork 4 e invece la funzione necessita del 2,anche se ho provato ad inserirlo nelle referenze ma non lo trovo.
Io mi ritrovo con:
AsyncCallback,AsyncCompletedEventArgs,AsyncCompletedEventHandler,AsyncFlowControl,AsyncOperation,AsyncOperationManager,IAsyncResult,InvalidAsynchronousStateException.
Riusciresti a farmi un piccolo esempio utilizzando File.CopyTo?Leggendo li ho capito un po il funzionamento però non riesco ad utilizzarlo.
Ho inserito un Thread.Sleep è la cosa è migliorata,mettendo una piccola pausa alla copia di ogni files devo dire che è migliorato,il programma non si blocca e la barra funziona.
Solo che il discorso è sempre quello,alla fine del processo mi appare il tutto nel ListView.
Come posso usare al meglio questa funzione Async?
Ti ringrazio ancora,mi stai veramente aiutando moltissimo :)
Grazie e buona giornata

massimo.missaglia Profilo | Newbie


Un esempio ...

public class AsyncFileCopier
{
public delegate void FileCopyDelegate(string sourceFile, string destFile);

public static void AsynFileCopy(string sourceFile, string destFile)
{
FileCopyDelegate del = new FileCopyDelegate(FileCopy);
IAsyncResult result = del.BeginInvoke(sourceFile, destFile, CallBackAfterFileCopied, null);
}

public static void FileCopy(string sourceFile, string destFile)
{
File.Copy(sourceFile, destFile);
}

public static void CallBackAfterFileCopied(IAsyncResult result)
{
//...
}
}

private void Form1_Load(object sender, EventArgs e)
{
DirectoryInfo dInfo=new DirectoryInfo(@"C:\prova");

foreach (FileInfo f in dInfo.GetFiles() )
AsyncFileCopier.AsynFileCopy(f.FullName, @"D:\prova\" + f.Name);
}

http://msdn.microsoft.com/it-it/library/2e08f6yc(v=vs.100).aspx

Massimo Missaglia
-------------------------------
www.MassimoMissaglia.com

HardTekCrash Profilo | Newbie

Grande Massimo!!!!
Funziona alla grande!!!!! :)
Posso chiederti un'ultima cosa?Giuro che è l'ultima
In
public static void CallBackAfterFileCopied(IAsyncResult result)
{

}

sto cercando di passare il ListView che ho nel Form1 per tracciare ogni file copiato,del tipo:
public static void CallBackAfterFileCopied(IAsyncResult result)
{
listView1.Items.Add(file.Name);
}
però non riesco a passare il listView1 (credo perchè sia static).
Sto tentando in diversi modi,anche a modificare direttamente FileCopyDelegate e passargli un ListView ma non riesco.
Hai qualche soluzione?
Grazie ancora e scusa le domande un po banali,sono ancora un Junior alle prime armi :)
Ciao e buona giornata.

HardTekCrash Profilo | Newbie

UP...
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5