2011-09-08 191 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; 
    } 
}