【问题标题】:Console App wont stay open, after setting isBackground = true on thread在线程上设置 isBackground = true 后,控制台应用程序不会保持打开状态
【发布时间】:2014-04-16 22:50:22
【问题描述】:

所以我创建了一个需要监听客户端连接的服务器,并且在我的服务器类的构造函数中:

class Server
{
    private Thread listenerThread;
    private TcpListener listener;

    public Server()
    {
        this.listener = new TcpListener(IPAddress.Any, 5000);
        listenerThread = new Thread(ListenMethod) { IsBackground = true };

        listenerThread.Start();
    }


    private void ListenMethod()
    {
        listener.Start();

        while (true)
        {
            TcpClient client = listener.AcceptTcpClient();
        }
    }
}

但是当我像这样在我的主服务器中创建服务器实例时:

class Program
{
    static void Main(string[] args)
    {

        Server s = new Server();
    }
}

由于 ListenMethod 运行和 while 循环,服务器应该保持打开状态,但程序似乎完成了构造函数并关闭了程序。

有什么想法吗?

谢谢:)

【问题讨论】:

  • 为什么不让主线程成为服务器呢?当主线程什么都不做时创建后台线程似乎毫无意义。

标签: c# .net multithreading console-application


【解决方案1】:

后台线程不会使控制台应用程序保持活动状态,这也是它们的用途。 Server 类实例也超出了范围,因为它没有被任何东西使用;在此应用程序的发布版本中,它甚至可能不会被编译到应用程序中并被优化掉。你需要做这样的事情:

static void Main(string[] args)
{
    Server server = new Server();

    Console.Write("The server is running. Press any key to stop the server.");
    Console.ReadKey();
    server.Stop();
}

【讨论】:

  • 您也有 listener 未初始化,如另一个答案中所述。
【解决方案2】:

在调用 Start() 之前,您似乎没有实例化您的 listner 实例,因此代码可能由于 NullReferenceException 而在 listener.Start() 上崩溃

我希望是这样的:

 private void ListenMethod()
    {
        listener = new TcpListener();
        listener.Start();

        while (true)
        {
            TcpClient client = listener.AcceptTcpClient();
        }
    }

【讨论】:

  • 嗨,对不起,我在创建问题时错过了这个。我确实初始化了。我已更改操作以反映这一点:)
猜你喜欢
  • 2021-07-17
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2012-07-03
  • 2023-04-11
相关资源
最近更新 更多