【问题标题】:C# Program keeps running in Processes after closing formC#程序在关闭表单后继续在进程中运行
【发布时间】:2011-12-30 20:41:27
【问题描述】:

最近,在使用我的 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,但您(或您的库)似乎没有将 Thread 的 IsBackground 属性设置为 true。
  • 该库不使用 System.Threading.Thread 而是使用 Socket AsyncResults。
  • 也许你应该等着看它是否被丢弃>
  • 你说lately 好像以前没有发生过一样。只是您没有注意到,还是之前实际上并没有发生?
  • 我确信这种情况一直都在发生。

标签: c# tcp process dispose


【解决方案1】:

NetLib.Server.Dispose() 是否处理所有“关闭”操作?通常在 .net 框架中 .Close() 调用 dispose 但 .Dispose() 不调用 close 操作。

【讨论】:

  • 实际上是相反的;在框架中对Dispose() 的调用将始终(据我所知)调用Close(),例如,在Stream 上调用Dispose()。否则 using 构造将毫无用处(没有双关语......)。仍然是一个很好的问题,因为这也是我的第一个想法。
【解决方案2】:

原来在库中忽略了一个线程。感谢大家尝试找出是否有任何上述问题会导致问题。

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

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 2019-08-05
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多