Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何等待MSTSC.exe退出_C#_.net_Mstsc - Fatal编程技术网

C# 如何等待MSTSC.exe退出

C# 如何等待MSTSC.exe退出,c#,.net,mstsc,C#,.net,Mstsc,我创建了一个管理应用程序,它还允许快速访问远程计算机的远程桌面会话。我需要等待进程结束,以便关闭到远程服务器的VPN连接。除了等待过程结束外,一切正常 以下代码用于启动MSTSC流程并等待其结束: var process = new Process { StartInfo = new ProcessStartInfo("mstsc.exe"), EnableRaisingEvents = true }; process.Exited += (o, e) => Console.Wri

我创建了一个管理应用程序,它还允许快速访问远程计算机的远程桌面会话。我需要等待进程结束,以便关闭到远程服务器的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();
程序启动后,几乎立即引发退出的
事件。当我将
mstsc.exe
替换为
notepad.exe
时,一切正常。我认为MSTSC可能会自行放弃并中止初始过程

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

在退出远程桌面会话之前,此命令不会返回。根据这些信息,我将代码替换为:

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进程立即终止。有人知道我做错了什么?

在调用Start()之后需要调用WaitForExit():

此重载导致当前线程无限期地等待,直到进程退出。还有一个重载,允许您指定要等待的毫秒数

process.WaitForExit();
无法工作,因为mstsc在开始时会打开其自身的新副本并关闭原始副本

process.WaitForExit();    
process = Process.GetProcessesByName(process.ProcessName).First();
process.WaitForExit();
会有用的,但这是一个糟糕的解决办法

更新1:

mstsc似乎关闭了原始进程,但并没有关闭其输出流! 因此,您可以等待process 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();

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

这可能是在运行后立即关闭mstsc(引发
退出
事件)的问题的答案。尝试在Visual Studio目标平台中更改为AnyCPU

假设你的机器是64位的Windows,你的应用程序是32位的。该应用程序运行32位mstsc。32位mstsc检测到Windows为64位,尝试自行关闭并运行64位mstsc(
Exited
事件在此时引发,即使mstsc启动GUI窗口)。 更改目标平台解决了我的问题

这对我很有效:

process.Start();
Thread.Sleep(2000);
while(getNumProcesses() > 0)
   process.WaitForExit();


private static int getNumProcesses()
{
    Process[] myProcesses = Process.GetProcessesByName("mstsc");
    return myProcesses.Length;
}

您不能等待mstsc.exe进程。确切地说,您不能简单地等待远程桌面的结束。当我逐个进程监视器观察mstsc.exe进程时,mstsc将其工作传递给svchost,mstsc.exe结束,但远程桌面仍在运行

但我为远程应用程序编写了脚本。 脚本remoteCmd.cmd启动remoteApplication,远程计算机创建一个临时文件(\\tsclient\c..\temp\xxx),remoteCmd.cmd等待临时文件存在。 看见

不是在使用更好的东西吗?
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();
process.Start();
Thread.Sleep(2000);
while(getNumProcesses() > 0)
   process.WaitForExit();


private static int getNumProcesses()
{
    Process[] myProcesses = Process.GetProcessesByName("mstsc");
    return myProcesses.Length;
}