使 Console.ReadLine 始终位于最后一行

2023-12-10

我有一个用 C# 编写的应用程序,它通过 while(true) 循环和 Console.ReadLine 连续获取用户的命令。

我也有各种后台操作通过控制台报告。查看这个简单的例子:

class Program
{  
        static void Main(string[] args)
        {
            new Messager(1000 * 2.5f);
            new Messager(1000 * 3);
            while (true)
            {
                Console.ReadLine();
            }
        }
}

public class Messager
{
    Timer Timer;

    public Messager(double interval)
    {
        this.Timer = new Timer(interval);
        this.Timer.Elapsed += (sender, e) =>
        {
            Console.WriteLine("message from " + this.Timer.Interval);
        };
        this.Timer.Start();
    }
}

问题是,当我输入命令并且消息发送器在我按下 Enter 之前报告回来时,来自消息发送器的消息将被附加到我的当前行,并且光标将被放置到下一行。看这个截图:

The problem

正如你猜想的那样,我不想要那样。我希望命令的当前输入始终保留在最后一行,并将所有消息放置在该行上方。正如您对此类应用程序的期望。我该如何实现这一目标?


这是非常非常难做到的。您最终会编写自己的控制台输入和输出方法,每个线程都必须调用它们。如果任何线程不合作,它就无法正常工作。但可以使用控制台 API。

基本思想是让通用输出函数写入控制台屏幕缓冲区,并在代码中滚动缓冲区,而不是让文本流到最后一行并自动滚动。我记得,您必须解析输出中的换行符和其他控制字符,并正确处理它们。

你也许可以使用Console.ReadLine在最后一行,尽管如果用户输入的文本多于单行所能容纳的文本,那么这样做会面临问题的风险。此外,用户在行尾按 Enter 可能会导致其向上滚动。在这种情况下最好使用原始控制台输入。

你会想要变得非常熟悉Windows 控制台.

预先警告:这是一项繁重的工作。并且可能不值得付出努力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使 Console.ReadLine 始终位于最后一行 的相关文章

随机推荐

  • 根据第二个数组中的值过滤对象数组

    我有一个对象数组 我想根据任何键的值是否与另一个数组中的任何值匹配来过滤它以创建一个新数组 const array1 name pink id 13 name orange id 17 name red id 64 name purple
  • 使用 ResourceDictionary 中的默认样式时,VS2008 XAML 设计器出现异常“Key不能为空”

    我使用共享的 ResourceDictionary 来定义默认样式 并且与 Visual Studio 2008 中的 XAML 设计器存在重大冲突 键不能为空对于所有显示 XAML 设计视图的尝试都会出现 该字典被合并到 App xaml
  • 哈希码总是相同的?

    我想知道HashCode是否总是相同的 例如 String myString my super string Int myHashCode myString GetHashCode Will myHashCode总是相同的值 在任何计算机上
  • 使具有多个文件名的“sed”的单个实例跳到下一个文件

    The next命令输入sed跳到下一行 但是对于多个文件 似乎没有任何命令可以跳到下一个文件 是否有任何解决方法仅使用single调用sed 问题演示 制作两个简单的 3 数数据文件 seq 3 gt three seq 10 1 13
  • 无法解析主机 github.com

    虽然我也有同样的问题question 但我面临着另一个问题 即 即使https github com 未在浏览器中运行并显示该网页不可用 这是在我安装 Heroku 后发生的 无法从终端访问 github 甚至无法从浏览器访问 诊断后我发现
  • 如何在Python中将字典项作为函数参数传递? [复制]

    这个问题在这里已经有答案了 My code 第一个文件 data school DAV standard 7 name abc city delhi my function data 第二个文件 my function data schoo
  • Shiny 仪表板内的 HTML 页面

    我的问题对于某些人来说很简单 但对于其他人 例如我 来说却很困难 I have a Shiny Dashboard in wich I want to add an html page inside a menuItem Se connec
  • 将 3 个列表合并为 1 个列表 [重复]

    这个问题在这里已经有答案了 我想将 3 个列表合并为一个列表 例如 我有三个列表 a 0 3 6 9 b 1 4 7 10 c 2 5 8 11 最后我想得到 merged 0 1 2 3 4 5 6 7 8 9 10 11 out of
  • 资源(.resx)文件有什么好处?

    使用它们有哪些令人信服的理由 资源文件根据用户的区域设置自动确定要使用的语言 resx 文件 为您提供了一种本地化 国际化 net 应用程序的简单方法 要添加更多语言 只需添加另一个翻译的资源文件即可 资源文件为您提供了一个存储字符串 文件
  • 删除 BottomNavigationView 标签

    谷歌发布了带有BottomNavigationView的新支持库v25 有什么办法可以去除物品标签吗 我希望我参加这里的聚会还不算太晚 但从设计支持库 28 0 0 alpha1 开始 您可以使用该房产 app labelVisibilit
  • ViewModel 在操作方法中获取空值

    我正在使用 ViewModel 来检索控制器操作中输入的数据 但 ViewModel 在其属性中获取空值 我正在创建一个局部视图 在那个局部视图中我正在创建下拉列表通过绑定 ViewModel 然后我渲染其他人的那部分观点View 下面是我
  • 使用 php 上传最大 100MB 的大文件

    我正在使用 PHP 制作一个文件托管网站 例如 Web 托管网站 megaupload rapidshare mediafire 等 或者告诉我它是否易于在 ASP NET 中实现 项目即将完成 但上传模块无法正常工作 我用谷歌搜索但找不到
  • 如何从 HTTP 处理程序中的 URL 获取参数

    我正在开发一个 Web 服务应用程序 其端点 加密货币 汇率接受两个货币 符号 作为输入 Web 服务应在数据库中搜索这些字符之间的货币兑换数据 如果数据库中没有值 或者时间戳值与当前值相差超过 1 分钟 则向服务 API 发出请求 htt
  • C# 中 async 总是异步吗? [复制]

    这个问题在这里已经有答案了 我正在做研发async and await对于我的项目 我学到的是 当async方法被调用时 它释放线程并让该线程被其他线程使用 我们可以使用可等待方法设置回调await关键字 并且该方法在结果准备好时返回值 如
  • Qt 对话框窗口的动态翻译

    我正在创建一个 Qt 应用程序 并添加了动态翻译 我按照以下示例进行操作 http www qtcentre org wiki index php title Dynamic translation in Qt4 applications
  • SQL Server:CROSS JOIN 和 FULL OUTER JOIN 之间有什么区别?

    SQL Server 中的 CROSS JOIN 和 FULL OUTER JOIN 有什么区别 它们是相同还是不同 请解释 什么时候会使用其中任何一个 A CROSS JOIN在两个表之间生成笛卡尔积 返回所有行的所有可能组合 它没有ON
  • ASP.Net 4.5 模型绑定按导航属性排序

    All 我有一个包含以下列的网格视图 分页效果很好 但排序不行 每次我单击类别列按类别排序时 我都会收到此错误 未为类型 ESA Data Models Entity Project 定义实例属性 Category CategoryName
  • 操作员删除签名意外行为[重复]

    这个问题在这里已经有答案了 stroustroup 在他的 C 编程语言 第 4 版 一书中提到 可以通过编写具有以下签名的全局函数来重载全局运算符 new delete void operator new size t use for i
  • 使用 Deriv 包求导 wrt 向量

    我正在探索 autodiff 我想使用Deriv用于计算函数对向量的导数 我写的 library numDeriv library Deriv h function x c 1 2 x grad h c 1 2 ok 1 1 2 dh De
  • 使 Console.ReadLine 始终位于最后一行

    我有一个用 C 编写的应用程序 它通过 while true 循环和 Console ReadLine 连续获取用户的命令 我也有各种后台操作通过控制台报告 查看这个简单的例子 class Program static void Main