在线程上设置isBackground = true后,控制台应用程序不会保持打开状态

时间:2014-04-16 22:50:22

标签: c# .net multithreading console-application

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

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循环,但程序似乎完成构造函数并关闭程序。

有什么想法吗?

谢谢:)

2 个答案:

答案 0 :(得分:3)

后台线程不会使控制台应用程序保持活动状态,这也是它们的目的。 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();
}

答案 1 :(得分:0)

在您致电listner之前,您似乎没有实例化Start()实例,因此listener.Start() <代码可能会因NullReferenceException而崩溃/ p>

我希望这样的事情:

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

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