Console.WriteLine(“”); 卡住

有时当我执行上述语句时,程序会在控制台应用程序中冻结。 如果我rest,我无法移动到下一行。 我需要重置缓冲区吗?

这是一个批处理应用程序,它向屏幕显示消息。 有没有人经历过这个并设法解决它。 这似乎是一件新鲜事。 我正在使用Visual Studio 2017教授版。

WriteLine停止的function如下。 sMessage值为空白“”。

 static void Display(string sMessage, DisplayColours eColour = DisplayColours.White) { if (eColour == DisplayColours.Yellow) Console.ForegroundColor = ConsoleColor.Yellow; if (eColour == DisplayColours.Blue) Console.ForegroundColor = ConsoleColor.Cyan; if (eColour == DisplayColours.Green) Console.ForegroundColor = ConsoleColor.Green; if (eColour == DisplayColours.Red) Console.ForegroundColor = ConsoleColor.Red; if (eColour == DisplayColours.Magenta) Console.ForegroundColor = ConsoleColor.Magenta; if (oFptr != null) { oFptr.WriteLine(sMessage); oFptr.Flush(); } Console.WriteLine(sMessage); Console.ForegroundColor = ConsoleColor.White; } 

导致这种情况的一个原因是,如果您单击控制台窗口以便开始选择文本,换句话说,就是从控制台窗口复制文本的第一步。 发生这种情况时,对控制台窗口的写入将挂起,直到您返回到控制台窗口并按Enter键以删除选择框。

它也恰好是,甚至有时当我调试我的代码时它没有启动(只是冻结)。 有时我需要停止执行并重新调用我的代码。 我删除了visual studio并重新安装,现在一切都很顺利。 我建议你也这样做。

使用System.Threading.Tasks.Dataflow nuget包,您可以使用缓冲区来帮助在用户选择控制台窗口上的文本时不锁定应用程序

  private static BufferBlock _buffer = new BufferBlock(); private static Task _consumer; private static CancellationTokenSource _cts; public static void Main(string[] args) { _buffer = new BufferBlock(); _cts = new CancellationTokenSource(); _consumer = ConsumeAsync(_buffer, _cts.Token); for (int i = 0; i < 100000; i++) { WriteToConsole(i.ToString()); } Console.ReadLine(); } private static void WriteToConsole(string message) { SendToBuffer(_buffer, message); } private static void SendToBuffer(ITargetBlock target, string message) { target.Post(message); } private static async Task ConsumeAsync(IReceivableSourceBlock source, CancellationToken cancellationToken) { while (await source.OutputAvailableAsync(cancellationToken)) { var message = await source.ReceiveAsync(); Console.WriteLine(message); } } 

这意味着写入控制台根本不会阻塞,因此它可能在很多场景中都没用。 在我的情况下,我只需要吐出日志信息