繁体   English   中英

引发了什么线程的Process.OutputDataReceived?

[英]What thread is Process.OutputDataReceived raised and handled on?

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

我对运行了我注册的Process.OutputDataReceived的处理程序的线程感到困惑。 根据MS文档:“OutputDataReceived事件表明关联的进程已写入其重定向的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线程与工作线程上执行上述操作会有所不同吗?

您应该将myProc.SynchronizingObject属性设置为窗体或控件。

否则,我相信该事件将在IO完成线程(来自ThreadPool)上引发。

另请参阅本页最底部的用户评论:

Process.OutputDataReceived是在与实例化和配置Process对象的线程不同的线程上引发的,并启动了该进程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM