2011-04-12 5 views
9

Tengo una aplicación de winforms multiproceso. Un hilo para la GUI y un hilo para el procesamiento en segundo plano. En el procesamiento en segundo plano, me comunico con un proceso externo a través de la clase Process para enviar datos de recepción.¿Qué subproceso se procesó y procesó en Process.OutputDataReceived?

Estoy confundido acerca de qué hilo se ejecutó el controlador que registré Process.OutputDataReceived. De acuerdo con la documentación de MS: "El evento OutputDataReceived indica que el proceso asociado ha escrito en su flujo de salida StandardOutput redirigido". Pero no está claro quién está planteando el evento.

Ver código de ejemplo a continuación:

myProc= new Process(); 
myProc.StartInfo.UseShellExecute = false; 
myProc.StartInfo.RedirectStandardOutput = true; 
myProc.StartInfo.RedirectStandardError = true; 
myProc.StartInfo.RedirectStandardInput = true; 
myProc.StartInfo.FileName = "myapp.exe"; 
myProc.StartInfo.Arguments = arguments; 
myProc.StartInfo.CreateNoWindow = true; 
myProc.OutputDataReceived += new DataReceivedEventHandler(DataReceivedFromProc); 
myProc.ErrorDataReceived += new DataReceivedEventHandler(ErrorReceivedFromProc); 
myProc.Start(); 
myOutputStream = myProc.StandardInput; 
myProc.BeginOutputReadLine(); 
myProc.BeginErrorReadLine(); 

Así que en este caso, ¿qué hilo se ejecuta en DataReceivedFromProc? ¿Hay alguna diferencia si lo anterior se ejecuta en mi hilo GUI vs hilo de trabajo?

Respuesta

5

Debe establecer el myProc.SynchronizingObject property en su forma o control.

De lo contrario, creo que el evento se generará en un subproceso de finalización IO (desde el ThreadPool).

+0

¿Qué tiene que ver el evento de salida del proceso con los eventos que se generan mientras se está ejecutando el proceso? – Josh

+1

@Josh: Todos los eventos se generan de la misma manera (comprobé el origen, en 'interno vacío OutputReadNotifyUser') – SLaks

+1

También una nota para el futuro:" Si el proceso se usa dentro de Visual Studio 2005 en un diseñador de Windows Forms , SynchronizingObject se establece automáticamente en el control que contiene el Proceso. " – Josh

1

Véase también el comentario de usuario en la parte inferior de this page:

Process.OutputDataReceived se eleva en un subproceso diferente que el que crea una instancia y configurado un objeto de proceso, y comenzó el proceso.

Si el objeto Process se crea una instancia en el subproceso principal (o UI), no podrá actualizar la interfaz de usuario que se ejecuta en ese subproceso del controlador de eventos OutputDataReceived. En su lugar, deberá usar delegados para enviar un mensaje al hilo principal para su procesamiento.

Cuestiones relacionadas