我试图通过制作一个简单的小游戏来学习C#线程的开发方法。我遇到了一个可以肯定可以使用帮助的问题。

我的愿望是同时进行输入和输出。线程的输出将出现在屏幕的顶部,而用户的输入可以键入到屏幕的底部。我遇到的问题是,为了刷新屏幕,当我使用Console.Clear()时,它还会擦除用户输入的内容!下面,我附上了我要做的工作的极其简化的版本(以避免不必要的代码妨碍实际的问题)。

请注意:虽然在此示例中,我仅在屏幕顶部更新了一个字符,但我的实际程序在屏幕的顶部和中部会有很多文本,并且随着每个刻度线的变化而不断变化(这是我计划的)在1.5秒内使用)。

任何想法都很棒!我还是C#编程的新手,将为您提供的任何帮助而感到兴奋:)我唯一喜欢的就是设计。系统输出位于顶部,用户输入位于底部,并以“>”开头。如果我做的方法是错误的,那么将其全部扔出窗外并以其他方式来做就没有问题。

编辑:我的目标是让屏幕顶部的输出文本每1.5秒更新一次(每次运行计数线程),同时允许用户在屏幕底部键入内容。但是,我用于执行此操作的方法(清除然后将新内容写入屏幕)也消除了用户的输入!这样一来,每隔1.5秒钟,用户键入的任何输入都会消失,这是正确的,因为这正是Console.Clear所做的。因此,我正在寻找一种完成此任务的新方法。

简而言之:如何更新屏幕顶部/中间的文本,同时允许用户继续在屏幕底部键入内容?

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

namespace ConsoleApplication2
{
    class Program
    {

        static int i = 0;

        static void Main(string[] args)
        {
            Thread tickThread = new Thread(new ThreadStart(CountThread));
            Thread userThread = new Thread(new ThreadStart(UserInput));
            tickThread.Start();
            Thread.Sleep(1);
            userThread.Start();
            Thread.Sleep(20000);
            tickThread.Abort();
            userThread.Abort();
        }

        static void UserInput()
        {
            string input = "";
            while (true)
            {
                input = Console.ReadLine();
            }
        }


        static void CountThread()
        {
            while (true)
            {
                Console.Clear();
                Console.SetCursorPosition(0, 0);
                Console.WriteLine(i);
                i++;
                Console.SetCursorPosition(0, Console.WindowHeight - 1);
                Console.Write("> ");
                Thread.Sleep(1500);

            }
        }

    }
}

最佳答案

您可以为控制台中的每个单元格(除了为用户输入而设计的那些单元格)在循环中设置cursor position并编写一个空格符号。本质上,这将清除控制台窗口的一部分。
另外,您可以使用相同的方法将输出部分呈现到控制台。

10-07 18:56
查看更多