Цикл выполнения C # - PullRequest
       0

Цикл выполнения C #

2 голосов
/ 08 сентября 2011

Я только что создал небольшую программу, ничего особенного, на C #, которая открывает файл rdp. Затем он входит в бесконечный цикл и продолжает проверять, запущен ли mstsc, если это так, то он ничего не делает, если это не так (пользователь закрыл сеанс), он снова открывается. Я запустил приведенный ниже код, и он забил мой процессор, а затем, вскоре после синего экрана, 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 ]

3 голосов
/ 08 сентября 2011
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();
}

Вот часть кода, оптимизированная, и он не будет зависать ваш процессор на 100%.

Что вы можете сделать, это проверить событие процесса на Exit (не уверен), или просто проверитьrdp.HasExited если истина, чем перезапустить.

0 голосов
/ 08 сентября 2011

Попробуйте дождаться начала процесса. Оно не может начаться даже в теории.

Во-вторых. Вы проверяете, работает ли процесс некорректно, что приводит к ~ 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;
    }
}
0 голосов
/ 08 сентября 2011

Интересно, получает ли Process.GetProcesses (), поскольку он является методом, свежий список процессов. Возможно, сначала попробуйте сохранить результат в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...