Можно ли сразу перейти к следующему утверждению? - PullRequest
0 голосов
/ 10 августа 2011

Так что это может быть странный вопрос, но у меня есть программа на C #, которая запускается из консоли, и в большинстве случаев теперь все работает нормально, кроме одной вещи.

В моей программе есть фрагмент кода, похожий на ...

loadFile();

foreach(var x in imgSet)
{
  //do whatever
}

Проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы вся моя программа была автоматизирована и выполнялась с использованием планировщика задач, и я не хочу никакого взаимодействия с человеком. И программа просто вызывает метод loadFile() в консоли, но после того, как записывает выходные данные этого метода, пользователь должен нажать Enter, чтобы войти в цикл foreach. Я не совсем понимаю, почему это так, и мне было интересно, есть ли способ обойти это и сделать его полностью автоматизированным?

Ответы [ 5 ]

9 голосов
/ 10 августа 2011

Измените метод loadFile();, чтобы он больше не ждал, пока пользователь нажмет клавишу ввода, или, при необходимости, сделайте это, в зависимости от параметра (так что вы можете настроить его на ожидание или нет).

Выполнение программы будет проходить от строки к строке, как можно быстрее, без задержки. Если он ожидает взаимодействия с пользователем, это потому, что программа явно говорит, что это должно произойти.

4 голосов
/ 10 августа 2011

Если это консольная программа, loadFile() может вызывать Console.ReadKey() или Console.ReadLine()

Если вы можете изменить код для метода loadFile(), вы можете добавить параметр или перегрузку, которая пропустит любой ненужный ввод от пользователя.

1 голос
/ 10 августа 2011

Почему бы просто не предоставить аргумент вашему консольному приложению, так что всякий раз, когда вы запрашиваете ввод у пользователя, если предоставленный аргумент говорит вам не делать этого, пропустите строку?

Пример:

protected bool _skipConsoleInput = false;

public static void Main(string[] args)
{
     if(args != null && args.Count > 0 && args[0] == "SkipConsoleInputYo")
         _skipConsoleInput = true;

     loadFile();

     GetConsoleInput();

     foreach(var x in imgSet) { }
}

protected string GetConsoleInput()
{
    if(_skipConsoleInput)
       return string.Empty;

    return Console.ReadLine();
}

Если вы не указали аргумент, вы должны нажать Enter. Если вы это сделаете, он пропускает его полностью.

1 голос
/ 10 августа 2011

Метод loadFile должен делать что-то, что ожидает ввода пользователя. Поскольку это ожидание блокирует поток, после кода этого метода вы ничего не могли бы вставить в код, который заставил бы его «перепрыгнуть» мимо оператора блокировки (указатель выполнения никогда не достигнет этой строки, пока он ожидает пользователя) , Вам нужно будет зайти в loadFile и посмотреть, сможете ли вы реорганизовать его, чтобы сделать ввод данных пользователем необязательным (возможно, в зависимости от параметра аргумента, который вы указываете в командной строке).

1 голос
/ 10 августа 2011

Вам нужно заглянуть внутрь метода loadFile и найти ту часть, где он ожидает ввода пользователя.

...