重用过程对象和IO在C#重定向(Reusing Process object and IO redi

2019-10-18 04:38发布

我使用Process类的数据就绪事件得到一个正在运行的进程的标准输出和标准错误信息。

它在第一次运行的伟大工程,但在调用停止后(),然后开始()来强制应用程序的重新启动,我不再收到的数据。 我试过CancelErrorRead(),但没有运气。

我考虑的只是重新实例每次我需要重新运行应用程序时的对象,但似乎很傻需要做到这一点。

关于如何重新使用Process对象重新启动停止的进程有什么建议?

相关的代码块:

构造函数:

   ProcessStartInfo objStartInfo = new ProcessStartInfo();
    objStartInfo.CreateNoWindow = true;
    objStartInfo.RedirectStandardInput = true;
    objStartInfo.RedirectStandardOutput = true;
    objStartInfo.RedirectStandardError = true;
    objStartInfo.UseShellExecute = false;

    objClient = new Process();
    objClient.StartInfo = objStartInfo;

    objClient.EnableRaisingEvents = true;
    objClient.OutputDataReceived   += new DataReceivedEventHandler(read);
    objClient.ErrorDataReceived    += new DataReceivedEventHandler(error);

开始:

    objClient.StartInfo.FileName    = strAppPath;
    objClient.StartInfo.Arguments   = strArgs;
    start();
    objClient.BeginErrorReadLine();
    objClient.BeginOutputReadLine();

停止:

    objClient.Close();
    objClient.CancelErrorRead();
    objClient.CancelOutputRead();

Answer 1:

你的Process对象与过程,直到你打电话不相关Start()或使用的静态方法关闭一个Process )。 一个被停止/关闭过程在功能上相同,因为没有过程可言。 鉴于此,很难相信有任何开销相比,在Windows上创建进程的(相对巨大)成本时,创建一个新的Process对象。 根据需要,只要创建新工艺对象。



Answer 2:

根据MSDN,你应该叫BeginOutputReadLineBeginErrorReadLine使异步从StandardOutput或使用StandardError的事件读取。

看一看在备注部分BeginOutputReadLine



文章来源: Reusing Process object and IO redirects in C#