为什么当文本被高亮显示时c#控制台应用程序停止运行

本文关键字:应用程序 控制台 运行 文本 高亮 显示 为什么 | 更新日期: 2023-09-27 18:02:49

我有一个控制台应用程序,它充当同步服务器套接字,从同一台机器上的同步客户端套接字接收数据。

从客户端向服务器发送一些数据几次后,我意识到如果我要在控制台上突出显示一些文本,它将停止运行代码,并且客户端将无法建立连接。

我想知道为什么会发生这种情况,如果有一种方法,使代码仍然运行。

为什么当文本被高亮显示时c#控制台应用程序停止运行

基本上,控制台是锁定的,以防止它必须缓冲可能无限数量的数据(对于执行大量控制台IO的程序)。你可以在这里看到:

using System;
using System.Net;
using System.Text;
using System.Threading;
static class P {
    static void Main() {
        using (var http = new HttpListener())
        {
            http.Prefixes.Add("http://localhost:20000/");
            http.Start();
            ThreadPool.QueueUserWorkItem(delegate {
                try {
                    while (true) {
                        var ctx = http.GetContext();
                        Console.Write("."); // <===== this
                        var buffer = Encoding.UTF8.GetBytes(DateTime.Now.ToString());
                        ctx.Response.OutputStream.Write(buffer, 0, buffer.Length);
                        ctx.Response.OutputStream.Close();
                    }
                }
                catch { }
            });
            Console.WriteLine("Running for 5 minutes...");
            Thread.Sleep(TimeSpan.FromMinutes(5));
            http.Stop();
        }
    }
}

如果你运行这个,它会设置一个web服务器,当你点击http://localhost:20000/时,它只会写当前时间。在当前代码中,如果您选择控制台上的一个区域,它将中断web-server,因为web-server在这一行访问控制台(不是一个好主意):

Console.Write("."); // <===== this

那么现在:删除(或注释掉)那一行然后重试。现在,当您在屏幕上选择文本时,它不会停止web服务器,因为web服务器不会尝试访问控制台。

所以回答你的问题:看看以任何方式访问控制台的任何代码。这通常可以在保留输出的同时完成,方法是让主代码写入某种队列(实际上Queue<string>就可以了),并让一个不同的(非关键)线程从队列写入到控制台。如果输出队列被阻塞:没有人在乎。