我正在从 C# 调用命令行进程,该进程从某个远程服务器进行更新。当它可以找到远程服务器并从中获取数据时,工作正常。如果未连接到网络也可以正常工作。
但是,当远程服务器无法访问时,外部进程将无限期地尝试获取数据,并且没有命令行选项来指定超时。所以我在尝试了 15 秒后对进程添加了强制终止。
using (var process = new Process {...})
{
process.Start();
if (!process.WaitForExit(15 * 1000))
{
process.Kill();
}
}
我可以看到当调用
process.Kill()
时进程被终止,但是当退出 using
范围时(即处置进程时),它会挂起。
这有什么问题吗?我是否遗漏了一些东西来确保这个进程被正确杀死?
谢谢!
编辑:
进程开始信息是
FileName = command,
Arguments = arguments,
WorkingDirectory = workDir,
CreateNoWindow = true,
UseShellExecute = false
这已经很老了,但我也遇到了同样的问题,尽管情况不同。由于我只能在这里找到关于我的问题的这个问题,所以我决定在这里发布我如何修复它。
就我而言,我在 C# 表单应用程序中运行它,无窗口且异步,没有与网络相关的内容发生。
在退出事件时,我调用了一个进行一些清理的方法,包括进程的 dispose 方法。因为该进程在另一个线程上运行,并且我还在进程退出事件上进行 UI 更新,所以我将代码放入
control.Invoke();
方法中,该方法在与控件相同的线程上运行该代码,否则我会收到错误.
显然,在另一个线程上处置进程导致了问题,一旦我将处置移到同一线程上,进程就会停止挂起。