C # | Консольное приложение | Как заставить программу ждать (время в мс) перед выполнением следующей строки? - PullRequest
1 голос
/ 12 апреля 2019

Я создаю консольное приложение на c # (.NET Framework) и хочу создать красивое приложение, используя некоторые «анимации». Я хочу напечатать «Нажмите любую клавишу, чтобы продолжить ...», и она начнет мигать (появляются, а затем исчезают, пока пользователь фактически не нажмет любую клавишу.

 do
    {
       while (!Console.KeyAvailable)
         {
             Console.WriteLine("Press any key to continue...");

     /* here i want the program to wait for like 500ms,
      clear console and wait 500ms again before rewriting line*/

             Console.Clear();
         }
     } while (Console.ReadKey(true).Key != ConsoleKey.Escape);

Ответы [ 4 ]

3 голосов
/ 12 апреля 2019

Простой способ сделать это - использовать

System.Threading.Thread.Sleep (5000);// Пауза на 5 секунд.Для прошивки сделайте это.

Console.Clear();
Console.WriteLine("SomeText");
System.Threading.Thread.Sleep(1000);
Console.Clear();
Console.WriteLine("SomeText");
System.Threading.Thread.Sleep(1000);
/// ETC.. 

Console.WriteLine("Press Any key To Continue...)

Это простой способ сделать это и поможет вам понять кодирование.Если вы хотите, чтобы он продолжал мигать, просто поместите его в цикл.ТЕМ НЕ МЕНИЕ!Имейте в виду, что этот код «Паузы» эффективно работает.Поэтому, если он находится на линии паузы, он НЕ позволит пользователю нажать клавишу для продолжения.Вот почему я поместил финальный Console.WriteLine(); внизу.Если вы хотите, чтобы пользователь мог нажимать клавишу в любое время и постоянно мигать, тогда вам придется участвовать в многопоточности, которая, вероятно, немного сложнее, чем то, что вас интересует.

2 голосов
/ 12 апреля 2019

Немного другой подход - использовать класс 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
}
2 голосов
/ 12 апреля 2019

Вы можете выполнить серию действий с равными интервалами, как это:

using System;
using System.Threading;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program().Run();
        }

        private void Run()
        {
            do
            {
                while (!Console.KeyAvailable)
                    this.InvokeWithIntervals(1000,
                                             () => Console.WriteLine("Press any key to continue..."),
                                             () => Console.Clear());
            } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
        }

        private void InvokeWithIntervals(int interval, params Action[] actions)
        {
            foreach(var action in actions)
            {
                action.Invoke();
                Thread.Sleep(interval);
            }
        }
    }
}
2 голосов
/ 12 апреля 2019

Во-первых, я бы не использовал бы Thread.Sleep для этого. Спящий ваш основной поток обеспечивает довольно грубый пользовательский опыт ... Это быстрый и грязный подход, но не совсем то, для чего предназначен этот метод.

Вот быстрый пример, который использует таймер, чтобы высветить строку текста.

using System.Timers;
class Program
{
    static void Main(string[] aszArgs)
    {
        Timer myTimer = new Timer(500);
        myTimer.Elapsed += MyTimer_Elapsed;
        myTimer.Enabled = true;

        //Wait for a key. Or do other work... whatever you want
        Console.ReadKey();
    }

    private static bool cleared = true;
    private static void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (cleared)
            Console.WriteLine("Flash text");
        else
            Console.Clear();

        cleared = !cleared;
    }
}  

Я использую System.Timers.Timer в этом примере, в котором есть несколько убедительных документов и примеров здесь .

...