Программа C # продолжает работать в процессах после закрытия формы - PullRequest
4 голосов
/ 31 декабря 2011

В последнее время при использовании моего TCP / IP-сервера и клиента я заметил, что они оба остаются открытыми в процессах после того, как я их закрываю.

Я исправил клиент, оставшийся открытым, разместив сокет на сервере, который закрывает все асинхронные потоки в фоновом режиме моей инфраструктуры.

Однако при попытке сделать это с сервером, независимо от того, что я делаю, процесс остается открытым.

Если предположить, что сервер TCP / IP обрабатывает свои собственные объекты, есть ли в этом коде еще что-нибудь, что могло бы держать процесс открытым?

РЕДАКТИРОВАТЬ: ОБНОВЛЕНИЕ: Если я поставлю точку останова после строки Application.Run (new ServerForm ()) в Program.cs, она сломается, когда я нажму выход или вызову Application.Exit ().

Я не знаю, что зависает в программе, но она не выходит из Main.

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();
    }
}

}

Ответы [ 2 ]

0 голосов
/ 02 января 2012

Оказывается, что в библиотеке был пропущен один поток. Спасибо всем за попытку выяснить, есть ли что-то, что может вызвать проблему.

Чтобы ответить на вопрос: Ничто в приведенном выше коде не вызывало указанную проблему. Это был поток, который был открыт в библиотеке Netlib и никогда не обрабатывался при удалении и закрытии любого открытого соединения.

0 голосов
/ 31 декабря 2011

NetLib.Server.Dispose () обрабатывает все операции выключения? Часто .NET Framework .Close () вызывает dispose, но .Dispose () не вызывает операции закрытия.

...