gpt4 book ai didi

c# - 如何等到 MSTSC.exe 退出

转载 作者:太空狗 更新时间:2023-10-30 01:20:39 30 4
gpt4 key购买 nike

我创建了一个管理应用程序,它还允许快速访问远程计算机的远程桌面 session 。我需要等到进程结束,这样我才能关闭与远程服务器的 VPN 连接。一切正常,除了等待进程结束。

下面的代码用于启动 MSTSC 进程并等待它结束:

var process = new Process
{
StartInfo = new ProcessStartInfo("mstsc.exe"),
EnableRaisingEvents = true
};
process.Exited += (o, e) => Console.WriteLine("Process stopped.");
process.Start();
Console.ReadLine();

Exited 事件几乎在程序启动后立即引发。当我用 notepad.exe 替换 mstsc.exe 时,一切都按预期工作。我认为 MSTSC 可能会自行 fork 并中止初始过程。

但是可以使用以下命令(从命令行)等待 MSTSC 结束:

start /wait mstsc.exe

在我退出远程桌面 session 之前,此命令不会返回。鉴于这些信息,我用这个替换了我的代码:

var process = new Process
{
StartInfo = new ProcessStartInfo("cmd.exe"),
Arguments = "/c start /wait mstsc.exe",
EnableRaisingEvents = true
};
process.Exited += (o, e) => Console.WriteLine("Process stopped.");
process.Start();
Console.ReadLine();

这将运行 CMD.exe 并发出 start/wait mstsc.exe 命令。如果结束,CMD 过程也会结束,我很好(有一个讨厌的解决方法,但没关系)。不幸的是,这不会发生。 CMD 进程立即终止。有人知道我做错了什么吗?

最佳答案

process.WaitForExit();

不会工作,因为 mstsc 在启动时会打开其自身的新副本并关闭原始副本。

process.WaitForExit();    
process = Process.GetProcessesByName(process.ProcessName).First();
process.WaitForExit();

会工作,但这是一个糟糕的解决方法。

更新 1:

似乎 mstsc 关闭了原始进程,但不是它的输出流!因此,您可以等待进程 StandardOutput 关闭。

var process = new Process
{
StartInfo = new ProcessStartInfo("mstsc.exe") { UseShellExecute = false, RedirectStandardOutput = true }
};
process.Start();
process.StandardOutput.ReadToEnd(); //This will wait for stream to close.

或者如果你不想阻塞当前线程:

var process = new Process
{
StartInfo = new ProcessStartInfo("mstsc.exe") { UseShellExecute = false, RedirectStandardOutput = true }
};

process.Start();

var outputResultPromise = process.StandardOutput.ReadToEndAsync();
outputResultPromise.ContinueWith(o=> Console.WriteLine("Stream closed"));

Console.ReadLine();

关于c# - 如何等到 MSTSC.exe 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18405638/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com