我有一个进程,用它来运行几个命令。
Process mycmd = new Process();
mycmd.StartInfo = startInfo1;
mycmd.Start();
if (mycmd.ExitCode > 0)
{
// do something
}
mycmd.StartInfo = startInfo2;
mycmd.Start();
if (mycmd.ExitCode > 0)
{
// do something else
}
第一次执行命令时,exitcode为1.它也会在第二次运行时保存。如何重置退出代码? 其他问题是 - 可以两次打电话给“开始”吗?
答案 0 :(得分:2)
每次在var p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.Start();
p.WaitForExit();
var exitCode = p.ExitCode;
Console.WriteLine("Handle: {0}, PID: {1}, Exit code: {2}", p.Handle.ToInt32(), p.Id, exitCode);
p.StartInfo.FileName = "cmd.exe";
p.Start();
p.WaitForExit();
exitCode = p.ExitCode;
Console.WriteLine("Handle: {0}, PID: {1}, Exit code: {2}", p.Handle.ToInt32(), p.Id, exitCode);
实例上调用Handle: 1308, PID: 9060, Exit code: 1
Handle: 1324, PID: 8428, Exit code: 2
时,都会创建一个新进程,系统会为其分配资源。这些资源是进程句柄和其他属性,如退出代码和退出时间。如果你写的东西如下:
ExitCode
并使两个进程返回不同的值(通过键入命令窗口,例如退出1 和退出2 ),您将获得类似于此的输出:
Handle
Process
和IDisposable
等流程属性正确返回上次终止流程的值。但是它们在之前运行的进程中丢失了,并且还有资源泄漏,因为尚未处理为先前进程分配的系统资源(以下引用来自MSDN):
如果某个句柄对该进程开放,则操作系统会释放该句柄 进程退出时处理内存,但保留管理 有关进程的信息,例如句柄,退出代码和退出 时间。要获取此信息,可以使用ExitCode和ExitTime 属性。这些属性会自动填充进程 这个组件启动了。行政信息是 与所有与之关联的Process组件时释放 系统进程被破坏,并且不再保留已退出的句柄 过程
Close()
类型实现Dispose()
接口,当您在Process
实例上调用Process
(或Dispose()
)时,这些组件将被销毁(以下引用为来自MSDN):
Close方法会导致进程停止等待退出 等待,关闭进程句柄,并清除特定于进程的进程 属性。 (...)Dispose方法调用Close。放置流程 使用块中的对象处理资源而无需调用 关闭。
使用using (var p = new Process())
{
p.StartInfo.FileName = "cmd.exe";
p.Start();
p.WaitForExit();
var exitCode = p.ExitCode;
Console.WriteLine("Handle: {0}, PID: {1}, Exit code: {2}", p.Handle.ToInt32(), p.Id, exitCode);
}
using (var p = new Process())
{
p.StartInfo.FileName = "cmd.exe";
p.Start();
p.WaitForExit();
var exitCode = p.ExitCode;
Console.WriteLine("Handle: {0}, PID: {1}, Exit code: {2}", p.Handle.ToInt32(), p.Id, exitCode);
}
运行两个流程的正确方法包括调用{{1}}:
{{1}}