我需要在MSBuild任务期间运行一个进程,并在执行其他操作后正常关闭该进程。我不能使用kill
,因为它只是粗暴地终止了这个过程,并使一些事情处于不良状态。
有问题的过程是RavenDB,它通过在标准输入中输入q
来支持退出。这就是MSBuild任务的样子(缩短):
“RavenDBQuit”
<UsingTask TaskName="RavenDBQuit"
...
<ParameterGroup>
<ProcessId Required="true" ParameterType="System.Int32" />
</ParameterGroup>
<Task>
<Using Namespace="System.Diagnostics" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var process = Process.GetProcessById(this.ProcessId);
process.StandardInput.WriteLine("q");
]]>
</Code>
</Task>
</UsingTask>
“RavenDBStart
<UsingTask TaskName="RavenDBStart"
<ParameterGroup>
...
<ProcessId ParameterType="System.Int32" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.Diagnostics" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var process = new Process
{
StartInfo =
{
FileName = this.FileName,
WorkingDirectory = this.WorkingDirectory,
Arguments = this.Arguments,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardInput = true
}
};
process.Start();
this.ProcessId = process.Id;
]]>
</Code>
</Task>
</UsingTask>
我收到错误:
system.InvalidOperationException:未重定向StandardIn。
在按ID检索后,您似乎无法写入Process的标准输入,您将需要使用相同的对象。
我可以做点别的吗?我尝试在任务之间直接传递process
对象但不支持。
我的最后一招是在等待一段时间之后使用kill,希望RavenDB已经完成了当时所需的一切。