【问题标题】:How can I update the current line in a C# Windows Console App while waiting for ReadLine?如何在等待 ReadLine 时更新 C# Windows 控制台应用程序中的当前行?
【发布时间】:2011-04-23 21:19:31
【问题描述】:

在 C# 中构建 Windows 控制台应用程序时,是否可以在等待读取行时更新控制台中的行?

我当前的代码是:

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);

【问题讨论】:

    标签: c# console readline


    【解决方案1】:

    在循环内使用 Console.KeyAvailable。一旦它返回 true,用户就开始输入,因此调用 ReadLine()。但是,它并没有形成一个非常有吸引力的用户界面。考虑 Windows 窗体。

    【讨论】:

      【解决方案2】:

      是的。您可以在 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 上等待,但后台线程仍在打印。

      【讨论】:

      • 你能给出一个代码示例吗?我对 C# 比较陌生。我想知道线程是否是答案。
      • 你的 using 语句是什么?
      • @Arlen:我将其更改为 .NET 2,并为您提供了一个完全可编译的程序...
      • 我接受了这个答案,因为它提供了最详细的信息。他有近 100K 的原因是因为他给出了诸如此类的出色答案,反之亦然。所以别担心,你也可以做到的。
      • cb 中的cb => 代表什么?
      【解决方案3】:

      希望此解决方案对您有所帮助:

      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);
                  }
              }
          }
      }    
      

      【讨论】:

        猜你喜欢
        • 2010-10-27
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 2011-09-07
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多