为什么当文本被高亮显示时c#控制台应用程序停止运行
本文关键字:应用程序 控制台 运行 文本 高亮 显示 为什么 | 更新日期: 2023-09-27 18:02:49
我有一个控制台应用程序,它充当同步服务器套接字,从同一台机器上的同步客户端套接字接收数据。
从客户端向服务器发送一些数据几次后,我意识到如果我要在控制台上突出显示一些文本,它将停止运行代码,并且客户端将无法建立连接。
我想知道为什么会发生这种情况,如果有一种方法,使代码仍然运行。
基本上,控制台是锁定的,以防止它必须缓冲可能无限数量的数据(对于执行大量控制台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>
就可以了),并让一个不同的(非关键)线程从队列写入到控制台。如果输出队列被阻塞:没有人在乎。