Process.OutputDataReceived事件在哪个线程上引发和处理?

11

我有一个多线程的winforms应用程序,一个线程负责GUI,另一个线程负责后台处理。在后台处理过程中,我使用Process类与外部进程通信来发送和接收数据。

我困惑于我注册的Process.OutputDataReceived处理程序所运行的线程是哪个。根据微软文档:“OutputDataReceived事件表示关联的Process已写入其重定向的StandardOutput流。”但不清楚谁会引发该事件。

请参考下面的示例代码:

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();

那么在这种情况下,DataReceivedFromProc方法在哪个线程上运行?如果上述代码在我的GUI线程或工作线程上执行,是否会有区别?

2个回答

6

进程退出事件与进程运行时引发事件有什么关系? - Josh
1
@Josh:所有事件都以相同的方式触发(我已经检查了源代码,在“internal void OutputReadNotifyUser”中)。 - SLaks
1
未来的注意事项:如果在 Visual Studio 2005 中使用进程 (Process) 在Windows窗体设计器中,则SynchronizingObject会自动设置为包含该进程的控件。 - Josh

1

还可以查看此页面底部的用户评论:

Process.OutputDataReceived是在一个与实例化和配置Process对象以及启动进程不同的线程上引发的。

如果Process对象是在主(或UI)线程上实例化的,您将无法从OutputDataReceived事件处理程序更新在该线程上运行的UI。相反,您需要使用委托向主线程发送消息以进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接