我刚刚在C#中创建了一个小程序,没什么特别的,打开了一个rdp文件。然后它进入一个无限循环并继续检查mstsc是否正在运行,如果它不执行任何操作,如果不执行(用户已关闭会话),则重新打开。我运行了下面的代码并且它击中了我的CPU,然后在蓝色屏幕后不久,minidump说这是因为“这表明在执行从非特权代码转换为特权代码的例程时发生了异常。”
不确定这意味着什么,但是这个代码有什么问题?
static void Main(string[] args)
{
RDP();
for (int i = 1; i > 0; i++)
{
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Contains("mstsc.exe"))
{
}
else
{
RDP();
}
}
}
}
private static void RDP()
{
Process rdp = new Process();
rdp.StartInfo = new ProcessStartInfo("C:\\Alistair\\Default.rdp");
rdp.Start();
}
更新:我认为无限循环所需的处理能力可能是责备但我尝试循环5次但结果相同。
答案 0 :(得分:3)
static void Main(string[] args)
{
RDP();
while(true)
{
if(Process.GetProcessesByName("mstsc").Length == 0)
RDP();
Thread.sleep(300); // Use any value which is confortable with you're request
}
}
private static void RDP()
{
Process rdp = new Process();
rdp.StartInfo = new ProcessStartInfo("C:\\Alistair\\Default.rdp");
rdp.Start();
}
以下是优化代码的一部分,它不会将CPU挂起100%。
你可以做的是检查onExit上的Process事件(不确定),或者只检查rdp.HasExited
是否为true而不是重启。
答案 1 :(得分:0)
我想知道Process.GetProcesses(),因为它是一个方法,获得一个新的进程列表。也许首先尝试将结果存储在列表中。
答案 2 :(得分:0)
尝试等待进程启动。即使在理论上也无法立即开始。
二。检查进程是否运行不正确,导致大约100次调用RDP()
using System;
using System.Diagnostics;
using System.Threading;
class Watchdog
{
static void Main(string[] args)
{
while(true) {
if (!IsRdpRunning())
RunRdp();
Thread.Sleep(1000);
}
}
private static void RunRdp()
{
Process rdp = new Process();
rdp.StartInfo = new ProcessStartInfo(@"C:\Alistair\Default.rdp");
rdp.Start();
Thread.Sleep(10000);
}
private static bool IsRdpRunning()
{
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Contains("mstsc"))
{
return true;
}
}
return false;
}
}