我有一个多线程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线程与工作线程上执行上述操作会有所不同吗?
答案 0 :(得分:5)
您应该将myProc.SynchronizingObject
property设置为您的表单或控件。
否则,我相信该事件将在IO完成线程(来自ThreadPool)上引发。
答案 1 :(得分:1)
另请参阅this page最底部的用户评论:
Process.OutputDataReceived是在与实例化和配置Process对象的线程不同的线程上引发的,并启动了该过程。
如果在主(或UI)线程上实例化Process对象,您将无法从OutputDataReceived事件处理程序更新在该线程上运行的UI。相反,您必须使用委托将消息发送到主线程进行处理。