現在、クライアント/サーバーアプリケーションをC#フォームで作成しています。ウィンドウには、Log(テキスト領域)、コマンドライン(テキスト領域)、および1つのボタンがあります。私は実行中にサーバー(別のスレッド)を閉じることに問題があります。他のスレッドからTcpClientをリッスンするスレッドを停止するC#
void Server_Thread_Main(object arg)
{
TcpClient client;
Output.Insert_to_LOG_Window("Server initialized at IP: " + IP_ADDR + ":" + PORT);
while (true)
{
client = listener.AcceptTcpClient();
clients.Add(new C_Client(client, Output, client_ID_iter++));
clients[clients.Count - 1].Start();
}
}
私はコマンドラインに入力されたコマンドを処理するクラスを持っています。それはTask_Menagerと呼ばれています。各コマンドは、この機能
void Server_Task_CMD(optargs args)
{
bool if_start = false;
foreach(argument arg in args)
{
switch (arg.Option)
{
case "-stop":
Output.server.Stop_Server(); //<- stopping server
break;
case "-start":
if_start = true;
break;
case "-IP":
Output.server.Set_Server_IP(arg.Value);
break;
case "-PORT":
Output.server.Set_Server_PORT(arg.Value);
break;
case "-IPP":
if (arg.Value.Contains(':') == true)
Output.server.Set_Server_Params(arg.Value);
else
Output.Insert_to_COMMAND_Log("This " + arg.Value + " isn't valid IP:PORT notation!");
break;
case "-V":
case "-VIEW":
Output.server.Display_IP_PORT();
break;
default:
Output.Insert_to_COMMAND_Log("Not known command: " + arg.Option + " !");
break;
}
if(if_start==true)
Output.server.Initialize_Server();
}
}
を持つコマンドをproccesingための新しいスレッドによって処理され、この機能は
public void Stop_Server()
{
if (server_thread.IsAlive == true)
{
Output.Insert_to_LOG_Window("Stopping server...");
server_thread.Interrupt();
if (!server_thread.Join(2000))
{
server_thread.Abort();
}
Output.Insert_to_COMMAND_Log("Server has been stopped!!!");
}
else
Output.Insert_to_LOG_Window("Server isn't running right now!");
}
されており、問題は、サーバーのスレッドが停止されていない理由を私は知らないです。
hereは、こちらをご覧ください包むそれは私がいることを知っていた:)助けた、ありがとうございました'client = listener.AcceptTcpClient();'で停止していましたが、別のスレッドから停止できることはわかりませんでした。 –