2011-09-08 149 views
2

我刚刚在C#中创建了一个小程序,没什么特别,它打开了一个rdp文件。然后它进入一个无限循环并持续检查mstsc是否正在运行,如果它没有执行任何操作,如果它不是(用户已关闭会话),它将重新打开。我运行下面的代码,它敲击了我的CPU,然后在蓝屏之后不久,小型转储器说这是因为“这表示在执行从非特权代码转换到特权代码的例程时发生异常。C#执行循环

不知道这是什么意思,但任何想法这个代码有什么问题?

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

定义“蓝色筛选”。这个蓝屏你的整个PC? – Justin

+0

是的,它给了我死亡的蓝色屏幕,Valamas制定了什么导致它和科迪修复它,看到下面的答案 –

+0

这是什么操作系统?如果可以重现,您可能需要考虑向Microsoft提交错误报告。 – Justin

回答

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(不确定),或只是检查rdp.HasExited如果是,则重新启动。

+0

谢谢,这是明确解决了CPU问题,但它仍然继续打开rdp文件,即使mstsc进程正在运行 –

+0

@Bali C现在尝试它,它应该工作,因为使用Process.ProcessName测试,你应该只使用进程名称没有.exe扩展 – Burimi

+0

干杯的人,这真棒,完美的作品! –

0

我在想如果Process.GetProcesses(),因为它是一个方法,得到一个新的进程列表。也许尝试将结果存储在列表中。

+0

是的也许,但我如何保持列表更新,不会保持相同的进程,它读取第一个循环? –

+0

保持相同的代码。只是可以保留你读过的进程列表。使用ProcessID作为知道过程是否被读取的关键。 –

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; 
    } 
}