2011-09-12 8 views
0

私は作成しているゲーム用のC#サーバーを作成しており、マルチスレッドとソケットプログラミングを初めて使用しています。私のサーバーは、複数のクライアントをすべて別々のスレッドで保持できる必要があります。私のサーバーはコンソールアプリケーションとして実行されます。私の唯一の問題は、テストクライアントの1人がアプリケーションを終了するときに、実行中のスレッドを停止する方法がわからないことです。実行中にスレッドを停止するにはどうすればよいですか?ゲームサーバーのマルチスレッドエラー

+0

クライアントごとのスレッドを使用しないでください。 [恥知らずのプラグ](http://jonathan.dickinsons.co.za/blog/2011/02/net-sockets-and-you/) - try/catchはあなたのスレッドを「終了」する場所です。 –

答えて

0

あなたのスレッドは基本的にクライアントからの要求を待って応答を処理するメッセージ処理スレッドだと仮定します。その場合、スレッドのメインループは以下のようなHandleClientRequestsメソッドのように見えるかもしれません。この例では、正常な切断を前提としています。堅牢な実装では、クライアントが適切なシャットダウンシーケンスを実行せずに接続を切断したり、ある時点で接続が失敗する可能性も考慮されます。

public class ClientConnection { 
    private Socket _socket;   

    public ClientConnection(Socket socket) { 
     _socket = socket; 
     new Thread(HandleClientRequests); 
    } 

    /* snip */ 

    public void HandleClientRequests() { 
     bool disconnectRequested = false; 
     while(!disconnectRequested) { 
      var message = ReadNextMessageFromSocket(); 
      if(message.Type == MessageType.CloseConnection) { 
       disconnectRequested = true; 
      } else { 
       //service request and send response 
      } 
     } 
     ShutdownConnection(); 
     //after this point the thread terminates 
    } 
} 

いずれにせよ、あなただThreadStartメソッドは通常、あなたはあなたがあなたのスレッドが何をしたいされて何でもその中に、ループのいくつかの種類を持っている必要があり、そのループを知らせるために使用された条件を持っている必要がありますそれはスレッドが終了する時間です。

0

スレッドは、関数が返ったときに終了します。あなたのスレッドは、クライアントが離れてスレッドループから離れたことを認識する必要があります。

関連する問題