C#程序在关闭窗体后继续在进程中运行

C#程序在关闭窗体后继续在进程中运行,c#,tcp,process,dispose,C#,Tcp,Process,Dispose,最近,在使用我的TCP/IP服务器和客户机时,我注意到在关闭它们之后,它们在进程中都保持打开状态 我修复了客户端保持打开状态的问题,方法是将套接字处理到服务器,从而关闭框架后台的所有异步线程 但是,当尝试使用服务器执行此操作时,无论我做什么,进程都保持打开状态 假设TCP/IP服务器正在处理它自己的东西,那么代码中还有什么东西可以保持进程的开放性吗 编辑:更新: 如果我在Program.cs中的Application.Run(new ServerForm())行之后放置了一个断点,那么一旦我按下

最近,在使用我的TCP/IP服务器和客户机时,我注意到在关闭它们之后,它们在进程中都保持打开状态

我修复了客户端保持打开状态的问题,方法是将套接字处理到服务器,从而关闭框架后台的所有异步线程

但是,当尝试使用服务器执行此操作时,无论我做什么,进程都保持打开状态

假设TCP/IP服务器正在处理它自己的东西,那么代码中还有什么东西可以保持进程的开放性吗

编辑:更新: 如果我在Program.cs中的Application.Run(new ServerForm())行之后放置了一个断点,那么一旦我按下exit或调用Application.exit(),它就会中断

我不知道它是什么挂断了程序,但它没有退出主程序

namespace ChatServer
{
    public partial class ServerForm : Form
    {
        private NetLib.Server _server = new NetLib.Server();
        public delegate void ClientConnection(ServerNetworkState ns);

    public ServerForm()
    {
        InitializeComponent();
    }

    private void ServerForm_Load(object sender, EventArgs e)
    {
        //Set up server IP and Port #.
        _server.Ip = "127.0.0.1";
        _server.Port = 5001;
        //Setup events for success/error checking
        _server.NewConnection += new NetLib.Server.NetworkStateEventHandler(_server_NewConnection);
        _server.Started += new NetLib.Server.ServerEventHandler(_server_Started);
        _server.Initialized += new NetLib.Server.ServerEventHandler(_server_Initialized);
        _server.BindFailure += new NetLib.Server.ServerEventHandler(_server_BindFailure);
        _server.BindSuccess += new NetLib.Server.ServerEventHandler(_server_BindSuccess);

        //Initialize Server and add neccesary commands
        _server.Initialize();

        //Clients will call sendmessage on the server,
        //and the server will send the message to the neccesary clients.
        _server.MessageEncoder.FriendlyCommands.Add("sendmessage", SendMessage);
    }

    public void SendMessage(short sender, short[] recipients, string text)
    {
        _server.MessagePump.Enqueue(new Packet(-1, recipients, "receivemessage", text));
    }

    void _server_BindSuccess()
    {
        //Log Bind Success at DateTime.Now
    }

    void _server_BindFailure()
    {
        //Log Bind Failure at DateTime.Now
    }

    void _server_Initialized()
    {
        //Log Initialized at DateTime.Now
    }

    void _server_Started()
    {
        //Log Started at DateTime.Now
    }

    void _server_NewConnection(NetLib.ServerNetworkState ns)
    {
        //Log New Connection with ns.Ip at DateTime.Now
        BeginInvoke(new ClientConnection(AddClientToControl), ns);            
    }

    private void AddClientToControl(NetLib.ServerNetworkState ns)
    {
        listBox1.Items.Add("ID: " + ns.Id + " IP: " + ns.Ip);
    }

    private void startServer_Click(object sender, EventArgs e)
    {
        _server.Start();
    }

    private void ServerForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        _server.Dispose();
    }
}

}NetLib.Server.Dispose()是否处理所有“关机”操作?在.net framework中,.Close()经常调用dispose,但.dispose()不调用Close操作。

结果表明,库中有一个线程被忽略了。感谢大家尝试找出是否有任何上述因素会导致问题


回答问题:上述代码中没有任何内容导致上述问题。这是一个在Netlib库中打开的线程,在处理和关闭任何打开的连接时从未处理过。

我不知道Netlib.Server,但看起来您(或您的库)不要将线程的
IsBackground
属性设置为true。该库不使用System.Threading.Thread,而是使用套接字AsyncResults.maybe。您应该等待,看看它是否被释放>您最近说
,就好像以前没有发生过一样。只是你没有注意到,还是以前没有发生过?我确信这一直都在发生。事实上,情况正好相反;在框架中,对
Dispose()
的调用将始终(据我所知)调用
Close()
,例如,在
流上调用
Dispose()
。否则,使用
构造的
将是无用的(没有双关语的意图…)。这仍然是一个好问题,因为这也是我的第一个想法。