我有一个在后台运行的进程并且有WaitForExit()
,因为持续时间可能会有所不同,我需要等到它完成。有时,我需要在它完成之前结束它,并.Kill()
通过类事件触发命令。该.HasExited
属性更改为 true 但代码永远不会通过该WaitForExit()
行。
public class MyProcess: Process
{
private bool exited;
public MyProcess()
{
...
}
public void Start(args...)
{
try
{
base.StartInfo.FileName = ...
base.StartInfo.Arguments = ...
base.StartInfo.RedirectStandardOutput = true;
base.StartInfo.UseShellExecute = false;
base.StartInfo.CreateNoWindow = true;
base.EnableRaisingEvents = true;
base.Exited += new EventHandler(MyProcessCompleted);
base.OutputDataReceived += new DataReceivedEventHandler(outputReceived);
base.Start();
this.exited = false;
base.BeginOutputReadLine();
while (!this.exited)
{
if ()
{
...
}
else
{
base.WaitForExit(); ---- after the process is killed, it never gets past this line.
}
...
}
}
catch (Exception ex)
{
...
}
}
private void MyProcessCompleted(object sender, System.EventArgs e)
{
exited = true;
...
}
private void outputReceived(object sender, DataReceivedEventArgs e)
{
...
}
//Subscription to cancel event
public void ProcessCanceled(object sender, EventArgs e)
{
...
if (!exited)
{
base.Kill();
}
}
}
\
更新:
我的进程启动一个基于 java 的文件传输客户端并执行传输。该过程显示在任务管理器中并且Kill()
不会结束它。由于我并不真正关心结束该过程,而是需要我的程序进入下一个“任务”,所以我Close()
在之后添加了Kill()
,它释放WaitForExit
并让我的代码“继续”。提前终止进程在我的应用程序中很少见,但我仍然需要它工作,所以这个实现必须做。
}