2017-03-20 7 views
0

現在、クライアント/サーバーアプリケーションを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!"); 



    } 

されており、問題は、サーバーのスレッドが停止されていない理由を私は知らないです。

答えて

0

これは、スレッドに閉じる正しい方法ではありません。現在、あなたのスレッドは、おそらくあなたが最初listener.Stop();
セカンドでリスナーを閉じる必要がありますlistener.AcceptTcpClient

に貼付されて、あなたはすべてのクライアントソケットを閉じる必要があります。
第3に、絶対に他の方法がない限り、thread.Abortに電話をかけてはいけません。

だからあなたStop_Serverがより次のようになります。

public void Stop_Server() 
{ 
    listener.Stop(); 
    server_thread.Join(); 
    Output.Insert_to_COMMAND_Log("Server has been stopped!!!"); 
} 

そして、あなたにメソッドをスレッドtry-catch(SocketException)

while (true)

+0

hereは、こちらをご覧ください包むそれは私がいることを知っていた:)助けた、ありがとうございました'client = listener.AcceptTcpClient();'で停止していましたが、別のスレッドから停止できることはわかりませんでした。 –

関連する問題