0

我有一个显示估计剩余时间的程序,但在执行此操作时还会打印其他内容。我想在不影响计时器位置的情况下打印其他部分。

这是我的示例输出:

将文件处理成更小的块......

还剩 90% 00:00:01。

成品加工文件
现在比较...

会员配对快照
还剩 10% 00:00:08。
        总计:0

分配快照
23% 00:00:07 还剩。
.trans.links[0].type.TransLinkType 102

.trans.links[0].fromTransactionRef.versionHandle.instanceHandle.id 102

        总计:204

交易快照

        总计:0

传输快照
86% 00:00:01 还剩。
.trans.links[0].size.amount 5

.trans.links[0].fromTransactionRef.versionHandle.instanceHandle.id 5

.trans.activityContextRef[0].versionHandle.instanceHandle.id 3708

        总计:3718

        所有对象类型中不同字段的总数:3922

生成的 xml 文件位于:c:\Users\grover\packer\XML

我想在 to 的自己的行上打印剩余的时间而不影响其他打印有没有办法做到这一点?

4

2 回答 2

0

如果你真的需要这样做,你可以覆盖已经写入控制台的内容,但这会带来非常糟糕的用户体验,除非它不经常更新

于 2013-04-10T19:13:17.293 回答
0

让代码打印时间执行以下操作:

  1. 将当前光标位置存储在变量中。
  2. 将光标移动到下一行。
  3. 每次要更新文本时:
    1. 将当前光标位置存储在另一个变量中。
    2. 将光标设置到第一步中光标所在的行。
    3. 写一些文字。
    4. 将当前光标位置设置为步骤 3.1 中存储的值。

这是一个简单的概念演示:

private static void Main()
{
    PrintTimes();

    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine("Some text is being printed");
        Thread.Sleep(1000);
    }

    Console.WriteLine();
    Console.WriteLine("press any key to exit . . .");
    Console.ReadKey();
}

private static async void PrintTimes()
{
    int line = Console.CursorTop;
    Console.WriteLine();
    for (int i = 0; i < 10; i++)
    {
        int previousLine = Console.CursorTop;
        int previousChar = Console.CursorLeft;
        Console.CursorTop = line;
        Console.CursorLeft = 0;
        Console.WriteLine("{0}% left       ", 100 - i * 10);
        Console.CursorTop = previousLine;
        Console.CursorLeft = previousChar;

        await Task.Delay(1000);
    }
}

请注意,在此演示中,done in 这个词PrintTimes不是原子的,因此仍然可以在其中一些操作之间注入另一个控制台写入。如果您最终经常写入控制台,则需要确保同步所有控制台写入。

于 2013-04-10T19:14:02.420 回答