我遇到了一件奇怪的事情,找不到发生这种情况的原因。
我有一个service.exe,我从配置注册表中收集数据,然后启动n个进程。
样例代码:
_mProcess.StartInfo = new ProcessStartInfo
{
FileName = Command,
Arguments = Argument,
WorkingDirectory = WorkDir
};
_mProcess.Start();
Pid = _mProcess.Id;
我Pid
包含进程ID。
现在我添加UseShellExecute = false
以获得StandardOutput。
新的示例代码:
_mProcess.StartInfo = new ProcessStartInfo
{
FileName = Command,
Arguments = Argument,
WorkingDirectory = WorkDir //,
//CreateNoWindow = true,
UseShellExecute = false,
//RedirectStandardOutput = true,
RedirectStandardError = true
//RedirectStandardInput = true
};
_mProcess.Start();
Pid = _mProcess.Id;
using (var reader = _mProcess.StandardError)
{
_logger.ToLog("", Company, reader.ReadToEnd(), "RCluster.log", "service");
}
在这种情况下,该过程会返回我可以存储到日志文件中的所有错误。
问题:这段代码是启动一个过程的方法的一部分,该过程我多次调用(取决于我的配置)。因此,使用此代码将调用第一个过程,而不会调用以下过程。服务以某种方式现在等待第一个服务。我以为只会发生这种情况WaitForExit
。
那么,如何获得标准错误输出却又不使流程阻塞我的主要任务以继续呢?
@古斯曼:添加您的评论作为答案,您就把我带到正确的答案。然后,我可以接受您的评论作为答案。
致反对者:解释为什么会受到赞赏。
所有人:我添加了一些代码以线程的形式启动新进程。在这种情况下,有必要在另一个线程中启动它以获取`StandardError消息,但不要阻塞主进程(在我的情况下,这是一个服务,可以启动许多子进程)。
// start as new thread to prevent blocking
var ths = new ThreadStart(() =>
{
mProcess.Start();
Pid = mProcess.Id;
// write pid file
File.WriteAllText(RubyDir + @"\tmp\pids\" + Port + @".pid", Pid.ToString());
using (var reader = mProcess.StandardError)
{
var errorMsg = reader.ReadToEnd();
if (errorMsg.Length > 0) _logger.ToLog("", Company, errorMsg, "SOLR.log", "service");
}
});
var th = new Thread(ths);
th.Start();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句