打印消息时,控制台中的行为不受欢迎

时间:2014-06-25 11:37:54

标签: c# console

这个问题可能与回车字符+并发性有关,但我不能完全指责它......我已经尝试了很多东西,但我还没有找到答案。我想至少找到一种纠正错误的方法。

Mi可执行文件是一个在命令行上打印行的调度程序。在随机的时刻,下图中显示的效果(见蓝色线之间的差异)出现,它永远不会离开。这也出现在一个随机的事件序列中,这意味着在这种情况下它是在ADDING之后但它也可以出现在我使用其他打印功能的自定义事件EXECUTING和ERROR之后。

enter image description here

您可以在下面找到举例说明此行为的代码。请注意,我使用令牌来避免并发。

/// <summary>
/// Console message when the system adds a new execution to the schedule.
/// </summary>
public void PrintAddedExecution(Database.Models.ExecutionSchedule executionDbItem, string messageString)
{
    Threading.Monitor.Enter(ConsoleToken);

    this.ClearLastLineInConsole();
    this.PrintCurrentTime();

    System.Console.BackgroundColor = ConsoleColor.DarkBlue;
    System.Console.WriteLine(" ADDING [ {0} ] : ", messageString);
    System.Console.ResetColor();

    System.Console.WriteLine(string.Format(" > exe='{0}' " + \r\n + " > cmd='{1}'", executionDbItem.exe, executionDbItem.cmd));
    System.Console.WriteLine();

    this.RepeatPrintSystemStatus();

    Threading.Monitor.Exit(ConsoleToken);

}

/// <summary>
/// Clears the last written line in the console ("clear" = "fills it with spaces")
/// </summary>
public void ClearLastLineInConsole()
{
    System.Console.ResetColor();
    System.Console.Write("{0}", \r);

    for (int characterCount = 1; characterCount <= System.Console.WindowWidth - 1; characterCount++) {
        System.Console.Write(" ");
    }

}

/// <summary>
/// Prints the sequence:
/// carriage_return + [ HH:mm ]
/// </summary>
private void PrintCurrentTime()
{

    System.Console.BackgroundColor = ConsoleColor.DarkGray;
    System.Console.ForegroundColor = ConsoleColor.Black;

    System.Console.Write("[ {0:HH:mm:ss} ]", Now);
    System.Console.ResetColor();
    System.Console.Write(" ");

}

2 个答案:

答案 0 :(得分:1)

试试这个:

int count = 0;

/// <summary>
/// Console message when the system adds a new execution to the schedule.
/// </summary>
public void PrintAddedExecution(string messageString)
{
    Monitor.Enter(ConsoleToken);

    if (count >= Console.BufferHeight)
    {
        Console.Clear();
        count = 0;
    }

    this.PrintCurrentTime();

    System.Console.BackgroundColor = ConsoleColor.DarkBlue;
    WriteLine(string.Format(" ADDING [ {0} ] : ", messageString));
    System.Console.ResetColor();

    WriteLine(string.Format(" > exe='{0}' ", "executionDbItem.exe"));
    WriteLine(string.Format(" > cmd='{0}'", "executionDbItem.cmd"));
    WriteLine();

    //this.RepeatPrintSystemStatus();

    Monitor.Exit(ConsoleToken);

}

/// <summary>
/// Prints the sequence:
/// carriage_return + [ HH:mm ]
/// </summary>
private void PrintCurrentTime()
{

    System.Console.BackgroundColor = ConsoleColor.DarkGray;
    System.Console.ForegroundColor = ConsoleColor.Black;

    System.Console.Write("[ {0:HH:mm:ss} ]", DateTime.Now);
    System.Console.ResetColor();
    System.Console.Write(" ");

}

// use this method to write a line so you can keep count of the
// total number of written lines
void WriteLine(string s = null)
{
    Console.WriteLine(s);

    count++;
}

关键是在已满时清除缓冲区,以测试尝试评论Console.Clear();行。

答案 1 :(得分:0)

所以我终于找到了避免这个错误的方法,虽然我仍然没有解释它。

解决方案是不使用这种代码:

有问题的代码:

Console.BackgrounColor = ConsoleColor.MyColor;
Console.WriteLine("Write Something In Console");
Console.ResetColor();

始终以其他方式使用:

“好”代码:

Console.BackgrounColor = ConsoleColor.MyColor;
Console.Write("Write Something In Console");
Console.ResetColor();
Console.WriteLine();

请注意,不同之处在于,如果颜色发生变化,我不再使用WriteLine()。 Just Write()。

我凭经验“发现”了这个效果,所以我试了一下。经过大量的测试后,它似乎完全正常。