Вы можете существенно упростить его, используя неблокирующую проверку Console.KeyAvailable
.Таким образом, вы можете выполнить весь свой код из основного потока:
using System;
using System.Threading;
class TestLoops
{
const int targetFPS = 5;
public static void Main(string[] args)
{
bool _continue = true;
DateTime _last = DateTime.MinValue;
while (_continue)
{
if (Console.KeyAvailable)
{
ConsoleKeyInfo cki = Console.ReadKey(true);
if (cki.Key == ConsoleKey.Q)
{
Console.WriteLine("\n'Q' was pressed.");
_continue = false;
}
if (cki.Key == ConsoleKey.P)
{
Console.WriteLine("\n'P' was pressed; press 'R' to resume.");
// Block until 'R' is pressed.
while (Console.ReadKey(true).Key != ConsoleKey.R)
; // Do nothing.
Console.WriteLine("'R' was pressed.");
}
}
DateTime _current = DateTime.Now;
if (_current - _last > TimeSpan.FromMilliseconds(1000F / targetFPS))
{
_last = _current;
// Do something...
Console.Write(".");
}
else
{
System.Threading.Thread.Sleep(10);
}
}
}
}
Редактировать : Ответ на комментарий.
Будьте осторожны.Код ниже блокирует из-за вызова Console.ReadKey
, а не из-за цикла while
.Цикл while
существует только для того, чтобы, если пользователь вводит символ, отличный от R
, программа отбрасывает его и ожидает ввода другого символа.
// Block until 'R' is pressed.
while (Console.ReadKey(true).Key != ConsoleKey.R)
; // Do nothing.
Если вы хотитеблокировать до тех пор, пока не будет нажата любой символ , просто введите:
Console.ReadKey(true);