C # - Захват пробела нажмите во время выполнения консольного приложения - PullRequest
1 голос
/ 02 марта 2011

Есть ли способ запустить процесс в консольном приложении, а во время выполнения, если нажата клавиша пробела, обновить консоль со статусом приложения?У нас есть процесс, который анализирует файлы для форматирования, и во время выполнения статус не обновляется.Есть ли способ захвата события клавиатуры во время выполнения, аналогичный подходу делегата CTRL-C?

TL / DR: во время выполнения процесса используйте пробел, чтобы обновить экран со статусом.

C # Консольное приложение.

1 Ответ

2 голосов
/ 02 марта 2011

Ну конечно, но вам понадобится фоновый поток для фактической обработки.По сути, просто сделайте так, чтобы ваш консольный процесс запускал синтаксический анализ вашего файла в фоновом потоке, а затем, пока он работает, проходите цикл проверки нажатия клавиши и оператора Thread.Yield ().Если клавиша была нажата, получите обновление статуса от некоторого класса, фоновый поток обновляет, как это работает:

private static StatusObject Status;

public static void main(params string[] args)
{
   var thread = new Thread(PerformProcessing);
   Status = new StatusObject();
   thread.Start(Status);

   while(thread.IsAlive)
   {
      if(keyAvailable)
         if(Console.ReadKey() == ' ')
            ShowStatus(Status);

      //This is necessary to ensure that this main thread doesn't monopolize
      //the CPU going through this loop; let the background thread work a while
      Thread.Yield();
   }

   thread.Join();
}

public void PerformProcessing(StatusObject status)
{
   //do your file parsing, and at significant stages of the process (files, lines, etc)
   //update the StatusObject with vital info. You will need to obtain a lock.
}

public static void ShowStatus(StatusObject status)
{
   //lock the StatusObject, get the information from it, and show it in the console.
}
...