为什么 C# 控制台应用程序在突出显示文本时停止 运行?
Why Does C# Console Application Stop Running When Text is HIghlighted?
我有一个控制台应用程序,它充当同步服务器套接字,从同一台机器上的同步客户端套接字接收数据。
从客户端向服务器发送了几次数据后,我意识到如果我要在控制台中突出显示某些文本,它将停止 运行ning 代码并且客户端将无法建立连接。
我想知道发生这种情况的原因,以及是否有办法使代码仍然 运行。
本质上,控制台被锁定,以防止它必须缓冲可能无限量的数据(对于执行大量控制台 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();
}
}
}
如果你 运行 这个,它会设置一个网络服务器,当你点击 http://localhost:20000/ 时,它只写当前时间。在当前代码中,如果您 select 控制台上的某个区域,它将 中断网络服务器 ,因为 网络服务器在这一行中访问控制台(不是一个好主意):
Console.Write("."); // <===== this
所以现在:删除(或注释掉)该行并重试。现在,当您 select 在屏幕上输入文本时,它 不会 停止网络服务器,因为网络服务器不会尝试访问控制台。
所以回答你的问题:查看任何以任何方式访问控制台的代码。这通常可以在保留输出的同时通过将主代码写入某种队列(字面意思是 Queue<string>
就可以),并有一个 different(非关键) ) 线程执行从队列到控制台的写入。如果输出队列被阻塞:没人关心。
我有一个控制台应用程序,它充当同步服务器套接字,从同一台机器上的同步客户端套接字接收数据。
从客户端向服务器发送了几次数据后,我意识到如果我要在控制台中突出显示某些文本,它将停止 运行ning 代码并且客户端将无法建立连接。
我想知道发生这种情况的原因,以及是否有办法使代码仍然 运行。
本质上,控制台被锁定,以防止它必须缓冲可能无限量的数据(对于执行大量控制台 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();
}
}
}
如果你 运行 这个,它会设置一个网络服务器,当你点击 http://localhost:20000/ 时,它只写当前时间。在当前代码中,如果您 select 控制台上的某个区域,它将 中断网络服务器 ,因为 网络服务器在这一行中访问控制台(不是一个好主意):
Console.Write("."); // <===== this
所以现在:删除(或注释掉)该行并重试。现在,当您 select 在屏幕上输入文本时,它 不会 停止网络服务器,因为网络服务器不会尝试访问控制台。
所以回答你的问题:查看任何以任何方式访问控制台的代码。这通常可以在保留输出的同时通过将主代码写入某种队列(字面意思是 Queue<string>
就可以),并有一个 different(非关键) ) 线程执行从队列到控制台的写入。如果输出队列被阻塞:没人关心。