2010-11-07 17 views
5

No proporcionaré todo el código, pero un ejemplo de lo que quiero hacer. Tengo este código para actualizar los elementos de GUI desde un proceso externo stderr.Cómo pasar objetos entre subprocesos al ejecutar un proceso System.Diagnostics

configurar mi proceso como este:

ProcessStartInfo info = new ProcessStartInfo(command, arguments); 

// Redirect the standard output of the process. 
info.RedirectStandardOutput = true; 
info.RedirectStandardError = true; 
info.CreateNoWindow = true; 

// Set UseShellExecute to false for redirection 
info.UseShellExecute = false; 

proc = new Process(); 
proc.StartInfo = info; 
proc.EnableRaisingEvents = true; 

// Set our event handler to asynchronously read the sort output. 
proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived); 
proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived); 
proc.Exited += new EventHandler(proc_Exited); 

proc.Start(); 

// Start the asynchronous read of the sort output stream. Note this line! 
proc.BeginOutputReadLine(); 
proc.BeginErrorReadLine(); 

entonces tienen un controlador de eventos

void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    if (e.Data != null) 
    { 
     UpdateTextBox(e.Data); 
    } 
} 

que invoca lo siguiente, que hace referencia a un control de cuadro de texto específico.

private void UpdateTextBox(string Text) 
{ 
    if (this.InvokeRequired) 
     this.Invoke(new Action<string>(this.SetTextBox), Text); 
    else 
    { 
     textBox1.AppendText(Text); 
     textBox1.AppendText(Environment.NewLine); 
    } 
} 

Lo que yo quiero es algo como esto:

private void UpdateTextBox(string Text, TextBox Target) 
{ 
    if (this.InvokeRequired) 
     this.Invoke(new Action<string, TextBox>(this.SetTextBox), Text, Target); 
    else 
    { 
     Target.AppendText(Text); 
     Target.AppendText(Environment.NewLine); 
    } 
} 

que puedo usar para actualizar diferentes cuadros de texto con de ese hilo, sin tener que crear una función separada para cada control en la interfaz gráfica de usuario.

¿Esto es posible? (obviamente, el código anterior no funciona correctamente)

Gracias.

ACTUALIZACIÓN:

private void UpdateTextBox(string Text, TextBox Target) 
{ 
    if (this.InvokeRequired) 
     this.Invoke(new Action<string, TextBox>(this.**UpdateTextBox**), Text, Target); 
    else 
    { 
     Target.AppendText(Text); 
     Target.AppendText(Environment.NewLine); 
    } 
}  

Este código sí parece funcionar ahora como me di cuenta de un error tipográfico .. Es esta bien usar?

+0

En realidad parece que esto funciona, solo que no he cambiado SetTextBox a UpdateTextBox cuando lo copié y pegué. – dave

+0

¿Podría explicar el problema que está experimentando? –

+0

Funciona, pero si pongo un break allí y miro "Target" en el IDE dice "Target.Text" lanzó una excepción de tipo 'Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException' " – dave

Respuesta

1

El código que proporcionó se ve bien y es una buena manera de enviar dichos mensajes entre hilos.

Cuestiones relacionadas