Tendrá que obtener los datos de un subproceso a la otra. Esto se puede hacer en un par de maneras ...
En primer lugar, el hilo "fondo" podría actualizar algún tipo de "CurrentStatus" variable de cadena que cambia a medida que avanza. Luego podría poner un temporizador en su formulario que luego tomaría la variable CurrentStatus y actualizaría la etiqueta con ella.
segundo lugar, usted podría simplemente invocar la operación desde el subproceso de fondo para el hilo de interfaz de usuario con un delegado utilizando la propiedad InvokeRequired del control de etiqueta. Así, por ejemplo ...
private delegate void UpdateStatusDelegate(string status);
private void UpdateStatus(string status)
{
if (this.label1.InvokeRequired)
{
this.Invoke(new UpdateStatusDelegate(this.UpdateStatus), new object[] { status });
return;
}
this.label1.Text = status;
}
Usted puede llamar a este método desde cualquier hilo (IU o de fondo) UpdateStatus(), y detectará si es o no necesita invocar la operación en el hilo principal interfaz de usuario (y si es así, ¿verdad?)
Para establecer realmente el hilo, puede hacerlo de esta manera:
private void StartProcessing()
{
System.Threading.Thread procThread = new System.Threading.Thread(this.Process);
procThread.Start();
}
private void Process() // This is the actual method of the thread
{
foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
// Do processing
// Show progress bar
// Update Label on Form, "f.Name is done processing, now processing..."
UpdateStatus("Processing " + f.Name + "...");
}
}
Luego, cuando el usuario hace clic en el botón "IR" se le llama simplemente StartProcessing().
Estoy de acuerdo con esto, especialmente para BackgroundWorker. Lo uso con frecuencia yo mismo.¡BackgroundWorkers hace que las operaciones de subprocesamiento múltiple como esta sean simples y fáciles! – Keithius