Ho una app di Windows # in forma che ho buttato insieme. E 'abbastanza semplice: \C# aggiorna e aggiungi il valore della casella di testo utilizzando il processo di backgroundworker
ingressi:
- stringa di testo
- fonte percorso della cartella
- percorso della cartella di destinazione
- intero contano
Le ricerche app attraverso file di testo nella cartella di origine per la stringa di testo inserita; se trova la stringa, copia quel file e un file immagine con lo stesso nome nella cartella di destinazione. Lo fa comunque molte volte in base all'input intero.
Così ho un tasto, e in caso pulsante di scatto io chiamo
ProcessImages(tbDID.Text, tbSource.Text, tbDest.Text, comboBoxNumberImages.SelectedItem.ToString());
che è:
private void ProcessImages(string DID, string SourceFolder, string DestFolder, string strNumImages)
{
int ImageCounter = 0;
int MaxImages = Convert.ToInt32(strNumImages);
DirectoryInfo di = new DirectoryInfo(SourceFolder);
foreach (FileInfo fi in di.GetFiles("*.txt"))
{
if (fi.OpenText().ReadToEnd().Contains(DID))
{
//found one!
FileInfo fi2 = new FileInfo(fi.FullName.Replace(".txt", ".tif"));
if (fi2.Exists)
{
try
{
tbOutput.Text += "Copying " + fi2.FullName + " to " + tbDest.Text + "\r\n";
fi2.CopyTo(tbDest.Text + @"\" + fi2.Name, true);
tbOutput.Text += "Copying " + fi.FullName + " to " + tbDest.Text + "\r\n";
fi.CopyTo(tbDest.Text + @"\" + fi.Name, true);
ImageCounter++;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
if (ImageCounter >= MaxImages)
break;
}
}
Quello che succede è che il processo funziona bene, ma voglio aggiornare un casella di testo sul modulo con avanzamento mentre i file vengono copiati. Fondamentalmente il modulo si stacca mentre è in esecuzione e, al termine, l'output è nella casella di testo. Mi piacerebbe implementare un BackgroundWorker per farlo aggiornare l'interfaccia mentre è in esecuzione.
Ho esaminato gli esempi ma non li sto seguendo davvero. Non ho un valore percentuale completo, voglio solo aggiornarlo. Text cambia ogni iterazione e lo mostra. Non penso nemmeno di dover necessariamente inserire l'azione di copia effettiva in thread diversi, ma sembra proprio che debba essere eseguito separatamente dal thread dell'interfaccia utente principale. Forse ho finito per complicare tutto questo ... qualcuno può spingermi nella giusta direzione? Grazie!
l'OP è già sulla strada giusta, che è quella di utilizzare BackgroundWorker, che sia crea il thread in background (beh, utilizza un pool thread) e tratta alcuni dei problemi a cui alludi nel tuo ultimo paragrafo. –
L'OP non indica che l'utente ha nient'altro da fare nell'interfaccia utente mentre l'elaborazione dei file è in corso, quindi un thread in background potrebbe essere overkill IMO. – dthorpe