Как я могу обновить текущую строку в C # Windows Console App, ожидая ReadLine? - PullRequest
2 голосов
/ 11 октября 2010

При создании приложения консоли Windows в C # возможно ли обновить строки в консоли, ожидая чтения строки?

Мой текущий код:

do
{
    Console.Clear();
    Console.WriteLine("RA:     " + scope.RightAscension);
    Console.WriteLine("Dec:    " + scope.Declination);
    Console.WriteLine("Status: " + scope.Slewing);
    System.Threading.Thread.Sleep(1000);
} while (true);

Ответы [ 3 ]

1 голос
/ 11 октября 2010

Да.Вы можете писать в Консоль из отдельного потока, блокируя Console.ReadLine.

При этом это может привести к путанице.В вашем случае вы выясните, что пользователь печатает на полпути через свою строку (через Console.Clear ()), а также резко измените положение курсора.


Редактировать: вотпример, который показывает это:

namespace ConsoleApplication1
{
    using System;
    using System.Threading;

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting");

            ThreadPool.QueueUserWorkItem(
                cb =>
                    {
                        int i = 1;
                        while (true)
                        {
                            Console.WriteLine("Background {0}", i++);
                            Thread.Sleep(1000);
                        }
                    });
            Console.WriteLine("Blocking");
            Console.WriteLine("Press Enter to exit...");
            Console.ReadLine();
        }
    }
}

Если вы запустите это, вы увидите, что Консоль ожидает ReadLine, но фоновый поток все еще печатает.

1 голос
/ 11 октября 2010

Использовать Console.KeyAvailable внутри цикла. Как только он возвращает true, пользователь начал печатать так, чтобы вызвать ReadLine (). Это не делает для очень привлекательного пользовательского интерфейса, хотя. Рассмотрим Windows Forms.

0 голосов
/ 11 октября 2010

Может это решение вам поможет:

using System; 
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace WaitForExit
{
    class Program
    {
        static void Main(string[] args)
        {
            new Thread(() =>
                {
                    Console.ReadLine();
                    Environment.Exit(0);
                }).Start();

            int i = 0;
            while (true)
            {
                Console.Clear();
                Console.WriteLine(++i);
                Thread.Sleep(1000);
            }
        }
    }
}    
...