最近、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();
}
}
}
NetLib.Serverについてはわかりませんが、あなた(またはあなたのライブラリ)がスレッドのIsBackgroundプロパティをtrueに設定していないようです。 –
ライブラリはSystem.Threading.Threadを使用せず、代わりにSocket AsyncResultsを使用します。 –
あなたはそれが処分されているかどうかを確認するために待つべきでしょうか> –