Немного другой подход - использовать класс Stopwatch
для измерения времени и изменять текст только в том случае, если мы прошли указанный «интервал флеш».
Мы могли бы написать метод для этого, который бы отображал string prompt
и TimeSpan interval
, который определяет, как долго ждать между миганием текста.
В коде мы бы зафиксировали положение курсора и цвета консоли, запустили секундомер, а затем каждый раз, когда секундомер проходит количество времени, указанное в interval
, мы меняли местами Console.ForegroundColor
и Console.BackgroundColor
.
Метод будет делать это до тех пор, пока пользователь не нажмет клавишу, которую мы вернем обратно вызывающей стороне:
private static ConsoleKey FlashPrompt(string prompt, TimeSpan interval)
{
// Capture the cursor position and console colors
var cursorTop = Console.CursorTop;
var colorOne = Console.ForegroundColor;
var colorTwo = Console.BackgroundColor;
// Use a stopwatch to measure time interval
var stopwach = Stopwatch.StartNew();
var lastValue = TimeSpan.Zero;
// Write the initial prompt
Console.Write(prompt);
while (!Console.KeyAvailable)
{
var currentValue = stopwach.Elapsed;
// Only update text with new color if it's time to change the color
if (currentValue - lastValue < interval) continue;
// Capture the current value, swap the colors, and re-write our prompt
lastValue = currentValue;
Console.ForegroundColor = Console.ForegroundColor == colorOne
? colorTwo : colorOne;
Console.BackgroundColor = Console.BackgroundColor == colorOne
? colorTwo : colorOne;
Console.SetCursorPosition(0, cursorTop);
Console.Write(prompt);
}
// Reset colors to where they were when this method was called
Console.ForegroundColor = colorOne;
Console.BackgroundColor = colorTwo;
return Console.ReadKey(true).Key;
}
Теперь, на вызывающей стороне, мы передадим ему текст «Нажмите escape для продолжения» и количество времени, которое мы хотим ждать (TimeSpan.FromMilliseconds(500)
в вашем случае), а затем мы можем вызвать это в бесконечном количестве * Цикл 1017 *, пока пользователь не нажмет ConsoleKey.Escape
:
private static void Main()
{
// Flash prompt until user presses escape
while (FlashPrompt("Press escape to continue...",
TimeSpan.FromMilliseconds(500)) != ConsoleKey.Escape) ;
// Code execution continues after they press escape...
}
Приятно, что вы можете повторно использовать логику и указывать более короткое или более длительное время флэш-памяти. Вы также можете изменить цвета, которые «вспыхивают», указав их перед вызовом метода (или метод может быть написан так, чтобы принимать их в качестве аргументов).
Например, попробуйте это:
private static void Main()
{
Console.WriteLine("Hello! The text below will flash red " +
"and green once per second until you press [Enter]");
Console.ForegroundColor = ConsoleColor.Red;
Console.BackgroundColor = ConsoleColor.Green;
while (FlashPrompt("Press [Enter] to continue...",
TimeSpan.FromSeconds(1)) != ConsoleKey.Enter) ;
Console.ResetColor();
// Code will now continue in the original colors
}