我有一个用 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 之前报告回来时,来自消息发送器的消息将被附加到我的当前行,并且光标将被放置到下一行。看这个截图:
正如你猜想的那样,我不想要那样。我希望命令的当前输入始终保留在最后一行,并将所有消息放置在该行上方。正如您对此类应用程序的期望。我该如何实现这一目标?
这是非常非常难做到的。您最终会编写自己的控制台输入和输出方法,每个线程都必须调用它们。如果任何线程不合作,它就无法正常工作。但可以使用控制台 API。
基本思想是让通用输出函数写入控制台屏幕缓冲区,并在代码中滚动缓冲区,而不是让文本流到最后一行并自动滚动。我记得,您必须解析输出中的换行符和其他控制字符,并正确处理它们。
你也许可以使用Console.ReadLine
在最后一行,尽管如果用户输入的文本多于单行所能容纳的文本,那么这样做会面临问题的风险。此外,用户在行尾按 Enter 可能会导致其向上滚动。在这种情况下最好使用原始控制台输入。
你会想要变得非常熟悉Windows 控制台.
预先警告:这是一项繁重的工作。并且可能不值得付出努力。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)