C#执行循环

时间:2011-09-08 10:11:29

标签: c# process

我刚刚在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次但结果相同。

3 个答案:

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