我已经创建了一个管理应用程序,它还允许快速访问远程计算机的远程桌面会话。我需要等待直到进程结束,这样我就可以关闭到远程服务器的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事件。当我将mstsc.exe替换为notepad.exe时,一切都如预期的那样工作。我认为MSTSC可能会分叉并中止初始进程。
但是,可以使用以下命令(从命令行)等待MSTSC结束:
start /wait mstsc.exe在退出远程桌面会话之前,此命令不会返回。考虑到这些信息,我用以下代码替换了代码:
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过程立即终止。有人知道我做错了什么吗?
发布于 2013-08-23 15:21:01
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();发布于 2014-06-01 09:41:41
这是关于启动mstsc的MSDN的链接,
这可能是您在运行后立即关闭mstsc的问题的答案(引发Exited事件)。尝试将Visual 目标平台更改为AnyCPU。
假设您的机器是64位Windows,您的应用程序是32位。该应用程序运行32位mstsc。32位mstsc检测到Windows是64位,试图关闭自身并运行64位mstsc (即使mstsc启动了GUI窗口,事件也会在此时引发)。改变目标平台解决了我的问题。
发布于 2013-08-23 22:08:27
有多个MSTSC进程正在运行,因此很难等待一个进程。我不明白的是,当我使用CMD.EXE命令时,start /wait可以这样做。
https://stackoverflow.com/questions/18405638
复制相似问题