【问题标题】:Why Does C# Console Application Stop Running When Text is HIghlighted?为什么 C# 控制台应用程序在突出显示文本时停止运行?
【发布时间】:2016-12-25 02:19:10
【问题描述】:

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

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

我想知道发生这种情况的原因以及是否有办法让代码仍然运行。

【问题讨论】:

  • 你有Console.ReadKey()吗?前几天我也遇到了同样的问题,很有趣
  • 有时 windows 会暂停窗口,因为您正在尝试选择某些东西,如果它以节的速度移动,您无法选择您想要的位
  • @CallumLinington 不,我没有使用 Console.ReadKey。
  • @BugFinder 啊,我明白他们为什么要这样做。有什么办法可以阻止这种情况吗?
  • Redirect 你的输出(可能是文本文件?)或者可能将 Console.Write 调用移动到不同的线程

标签: c# sockets server client console-application


【解决方案1】:

基本上,控制台被锁定,以防止它必须缓冲可能无限量的数据(对于执行大量控制台 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/ 时,它只会写入当前时间。在当前代码中,如果您在控制台上选择一个区域,它将中断 web-server,因为 web-server 在访问控制台(不是一个好主意)这一行:

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

所以现在:删除(或注释掉)该行并重试。现在,当您在屏幕上选择文本时,它不会停止网络服务器,因为网络服务器不会尝试访问控制台。

所以回答您的问题:查看以任何方式访问控制台的任何代码。这通常可以在保留输出的同时通过让主代码写入某种队列来完成(字面意思是Queue&lt;string&gt; 就可以了),并有一个不同(非关键)线程进行写入从队列到控制台。如果输出队列被阻塞:没人关心。

【讨论】:

  • 我想我现在明白了。非常感谢您花时间非常详细地回答我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2018-08-02
  • 2015-03-04
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多