Console.WriteLine( “”);卡住

时间:2017-07-24 08:18:28

标签: c# visual-studio-2017

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

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

WriteLine失速的功能如下。 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;
}

3 个答案:

答案 0 :(得分:27)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

    private static BufferBlock<string> _buffer = new BufferBlock<string>();
    private static Task _consumer;
    private static CancellationTokenSource _cts;

    public static void Main(string[] args)
    {
        _buffer = new BufferBlock<string>();
        _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<string> target, string message)
    {
        target.Post(message);
    }

    private static async Task ConsumeAsync(IReceivableSourceBlock<string> source, CancellationToken cancellationToken)
    {
        while (await source.OutputAvailableAsync(cancellationToken))
        {
            var message = await source.ReceiveAsync();

            Console.WriteLine(message);
        }
    }

这意味着完全不会阻塞对控制台的写入,因此在许多情况下它可能没有用。就我而言,我只需要吐出日志信息