2011-12-30 33 views
4

最近、TCP/IPサーバーとクライアントを使用しているときに、閉じた後に両方がプロセス内に開いたままになっていることがわかりました。C#プログラムは、フォームを閉じた後もプロセス内で実行され続ける

私のフレームワークのバックグラウンドですべての非同期スレッドを閉じるサーバーにソケットを配置することによって、クライアントを開いたままにしておくことを修正しました。

しかし、私が何をするにしても、サーバーでこれを実行しようとすると、プロセスは開いたままです。

TCP/IPサーバーがそれ自身のものを扱っていると仮定すると、このコードにはプロセスを開いたまま残すものがありますか?

EDIT:UPDATE: Program.csのApplication.Run(新しい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(); 
    } 
} 

}

+0

NetLib.Serverについてはわかりませんが、あなた(またはあなたのライブラリ)がスレッドのIsBackgroundプロパティをtrueに設定していないようです。 –

+0

ライブラリはSystem.Threading.Threadを使用せず、代わりにSocket AsyncResultsを使用します。 –

+0

あなたはそれが処分されているかどうかを確認するために待つべきでしょうか> –

答えて

0

ライブラリ内で見落とされたスレッドが1つありました。上記の問題が発生しているかどうかを調べることを試みてくれてありがとうございます。

質問に答えてください:上のコードの何も問題を引き起こしていませんでした。これはNetlibライブラリで開かれたスレッドであり、開かれていた接続を破棄して閉じるときには決して処理されませんでした。

0

NetLib.Server.Disposeは() 'シャットダウンの業務のすべてを処理していますか? .NETフレームワークでは、.Close()はdisposeを呼び出しますが、.Dispose()はclose操作を呼び出しません。

+7

(http://chat.stackoverflow.com/rooms/6270/discussion-between-kyle-uithoven-and-m-babcock)私たちは、[チャットでこの議論を続ける]みましょう。枠組みの中で '常に(私の知る限りでは)' '閉じる()を呼び出します、例えば、' 'Stream'上のDisposeを()'を呼び出す。) '廃棄(への呼び出しそれ以外の場合、 'using'構造は役に立たないでしょう。それは私の最初の考えだったので、依頼するにはまだ良い質問。 –

関連する問題