首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何等待直到MSTSC.exe退出

如何等待直到MSTSC.exe退出
EN

Stack Overflow用户
提问于 2013-08-23 14:42:36
回答 6查看 3.9K关注 0票数 4

我已经创建了一个管理应用程序,它还允许快速访问远程计算机的远程桌面会话。我需要等待直到进程结束,这样我就可以关闭到远程服务器的VPN连接。一切都很好,除了等待过程结束。

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

代码语言:javascript
复制
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结束:

代码语言:javascript
复制
start /wait mstsc.exe

在退出远程桌面会话之前,此命令不会返回。考虑到这些信息,我用以下代码替换了代码:

代码语言:javascript
复制
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过程立即终止。有人知道我做错了什么吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-08-23 15:21:01

代码语言:javascript
复制
process.WaitForExit();

无法工作,因为mstsc在开始打开新的副本本身和关闭原件。

代码语言:javascript
复制
process.WaitForExit();    
process = Process.GetProcessesByName(process.ProcessName).First();
process.WaitForExit();

会起作用但这是个糟糕的解决办法。

更新1:

看起来mstsc关闭了原始进程,而不是它的输出流!因此,您可以等待进程StandardOutput关闭。

代码语言:javascript
复制
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.

或者如果您不想阻止当前线程:

代码语言:javascript
复制
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();
票数 5
EN

Stack Overflow用户

发布于 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窗口,事件也会在此时引发)。改变目标平台解决了我的问题

票数 1
EN

Stack Overflow用户

发布于 2013-08-23 22:08:27

有多个MSTSC进程正在运行,因此很难等待一个进程。我不明白的是,当我使用CMD.EXE命令时,start /wait可以这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18405638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档