【问题标题】:Caching System.Console output缓存 System.Console 输出
【发布时间】:2009-11-23 07:06:05
【问题描述】:

我们有一些方法可以将大量彩色文本输出到控制台。

它实际上是一个通过循环数据集合构建的菜单。

因为我们是逐项写入(一行包含许多不同颜色的项目), 这个过程在低端和中端机器上相当慢。在这些机器上,您可以看到每一行都被逐一写入,这对最终用户来说相当令人沮丧。

这个菜单必须显示很多次,所以我想知道我是否不能以某种方式“缓存”这个输出。如果没有彩色文本,我只需将输出存储在一个字符串中并一次性写入,但我不想丢失颜色信息。

有什么建议吗?

更新:只是为了说明输出的密集程度: 更新 2: 更新了草率的代码,但仍想以某种方式缓冲输出。 MoveBufferArea 被证明是部分解决方案(它会创建不需要的滚动条)

DefaultBanner();

WriteLine("Available tests:\n", ConsoleColor.White);

var methodNames = methods.Select(m => ((TestAttribute)m.GetCustomAttributes(false)[0]).Name).ToArray();

int vertical = 0;
for (int i = 1; i <= methods.Length; i++)
{
    if (i > methods.Length / 2)
    {
        Console.SetCursorPosition(40, 4 + vertical++);
    }

    Write("(");
    Write(i, ConsoleColor.Yellow);
    WriteLine(") {0:00}", methodNames[i - 1]);
}

Write("\n(");
Write(items.Count + 1, ConsoleColor.Yellow);
Write(") Set address | (");
Write(items.Count + 2, ConsoleColor.Yellow);
Write(") View Log | (");
Write(items.Count + 3, ConsoleColor.Yellow);
Write(") Open Log directory \n(");
Write(items.Count + 4, ConsoleColor.Yellow);
Write(") Open configuration | (");
Write(items.Count + 5, ConsoleColor.Yellow);
Write(") View current configuration | (");
Write(items.Count + 6, ConsoleColor.Yellow);
WriteLine(") Quit");
Write("\nYour selection: ");

int command = 0;
while (!ConsoleReader<int>.TryReadValueInRange(1, items.Count + 6,out command));
return command;

Write 方法只是封装了一些行为的辅助方法 System.Console 类,这样我们就不必继续设置颜色了。

【问题讨论】:

    标签: c# .net console console-application


    【解决方案1】:

    也许你可以使用MoveBufferArea 函数做一些聪明的事情。如果您有一个当前对用户不可见的缓冲区区域怎么办。您可以在那里创建缓冲区\菜单,然后一次性将整个区域复制到可见缓冲区的一部分。我不知道您对缓冲区的可见/不可见区域有多少控制权,如果您可以这样使用它们,这只是一个建议。

    我能想到的唯一其他选择是创建您自己的模仿控制台的控件。然后,您可以允许缓冲读取/写入或仅在您进行多次更改后刷新。但这可能是很多额外的工作。

    【讨论】:

    • 此方法的缺点是它会创建滚动条,因此您可以滚动到“不可见”的内容......
    【解决方案2】:

    有没有办法将您的属性评估逻辑“移出循环”?我怀疑这不是您代码中最快的部分。

    【讨论】:

    • 再次查看代码,我意识到我每次都转换为数组确实减慢了速度......将再次更新和测试。谢谢
    【解决方案3】:

    我不知道您的项目是否可行,但一种选择是使用某种类型的标记语言将颜色存储在字符串本身内,例如&lt;yellow&gt;Text in yellow&lt;/yellow&gt;(或者您可以使用纯 CSS 选择器,或者任何)。这样你就可以使用纯字符串缓存了。

    顺便记住,.NET Framework 已经实现了一个这样的缓存:参见String.InternString.IsInterned

    【讨论】:

    • 但即使我存储了这个,我仍然必须在每次写入控制台时切换颜色。构建此字符串的过程不会占用太多时间。这是对 Console.Write、Console.WriteLine 和 Console.SetCursorPosition 和 Console.Foreground = 调用的无数次调用。 (PS:在快速机器上你根本不会注意到这一点)
    【解决方案4】:

    请记住,控制台是一个可配置的设备,这意味着您可以编写自己的设备(尽管我不推荐它)。有一种方法可以在配置文件中指定哪个类进行 Tracing 以及哪个类进行 Debug 输出。

    【讨论】:

      【解决方案5】:

      有没有办法让您的客户确保他们正在运行硬件加速图形(检查驱动程序)?如果它们使用 VGA-Only 默认 Microsoft 驱动程序运行,那么控制台会非常缓慢。

      【讨论】:

      • 嘿,不 :-) 例如,在路上我使用的是 Sony Vaio VGN-P21Z 上网本,它确实很慢 :p
      • 您的评论没有说明您使用的是什么图形驱动程序。
      • 哦抱歉 :p 我试过 Vaio 提供的和 Windows 提供的。但是视频等运行良好。
      猜你喜欢
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 2016-10-19
      • 2011-10-13
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多