这个问题可能与回车字符+并发性有关,但我不能完全指责它......我已经尝试了很多东西,但我还没有找到答案。我想至少找到一种纠正错误的方法。
Mi可执行文件是一个在命令行上打印行的调度程序。在随机的时刻,下图中显示的效果(见蓝色线之间的差异)出现,它永远不会离开。这也出现在一个随机的事件序列中,这意味着在这种情况下它是在ADDING之后但它也可以出现在我使用其他打印功能的自定义事件EXECUTING和ERROR之后。
您可以在下面找到举例说明此行为的代码。请注意,我使用令牌来避免并发。
/// <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(" ");
}
答案 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()。
我凭经验“发现”了这个效果,所以我试了一下。经过大量的测试后,它似乎完全正常。