2010-12-29 8 views
0

私はc#でTCPサーバアプリケーションを書いています。私はサーバーを実装するTcpCommunicationという名前のクラスを設計しました。次のようにスレッドを閉じる

public bool Connect() 
{ 
... 
listenThread = new Thread(new ThreadStart(ListenForClients)); 
     listenThread.IsBackground = true; 
     listenThread.Start(); 
... 
} 

ListenForClients方法が実装されている:(ユーザーが決定)いくつかのケースで

private void ListenForClients() 
    { 
     while (true) 
     { 
      try 
      { 
       //blocks until a client connects to the server 
       clientObj = tcpListener.AcceptTcpClient(); 

       //create a thread to handle communication with connected client 
       Thread clientThread = new Thread(new ThreadStart(Receive)); 
       clientThread.IsBackground = true; 
       clientThread.Start(); 
      } 
      ... 
     } 
    } 

Iを

private TcpListener tcpListener; 
private TcpClient clientObj; 
private Thread listenThread; 

とconnect()メソッド:TcpCommunicationは、次のメンバーを保持します新しいクライアントの聴取をやめ、既存のクライアントのサービスを停止したいと考えています。 私の質問は:すべてのサブスレッドは、クリエイタースレッド(メインスレッドではない)が異常終了したときに中断しますか? すべてのスレッドのコレクションを保持し、それらを1つずつ中止する必要がありますか、または次の実装で十分ですか?

public bool Disconnect() 
    { 
     if (listenThread != null) 
     { 
      listenThread.Abort(); 
      listenThread.Join(); 
     } 
     tcpListener.Stop(); 
     return true; 
    } 

答えて

0

スレッドには関係がありません。任意の順序でスレッドを削除できます。あなたが作成したスレッドのリストを保持する必要があります。私は、アプリケーション内のすべてのスレッドを強制終了するほど勇敢ではないでしょうし、フレームワークもいくつか作成するかもしれません。私があなたの場合、私はループ内でそれらのすべてを中断し、次にそれらをすべて2番目のループで結合して、より速くします。

0

ブロッキングモードになっている場合、アンダーリングサーバーソケットはスレッドをブロックします。これは同期WIN32操作であるためです。

あなたはそのためのスレッドを必要としません:

public static void StartTcpListener(TcpListener listener) 
{ 
    try 
    { 
     listener.Server.Blocking = false; 
     listener.BeginAcceptTcpClient(
      ar => 
      { 
       TcpClient client = listener.EndAcceptTcpClient(ar); 
      }, 
      listener); 
    } 
    catch 
    { 
     // catch exceptions on close, e.g. 
    } 
} 

聞きながら、そのソケットを閉じると、コンテキストをtry-catchブロックで囲まれているので、それがキャッチされ、ほとんどの場合、例外がスローされます。その例では、

1

それ自身がマルチスレッドサポートを提供するasynソケットを使用することを検討する必要があります。したがって、スレッドを管理する必要はありません。この例を参照してください。(メインスレッドではありません)、その作成者のスレッドがアボートしたときに

http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx

0

すべてのサブスレッドが中断しますか?

いいえは、オーナースレッド出口であっても実行できます。スレッドBが作成され、スレッドAで開始されても、スレッドBがスレッドAの一部であるとは限りません。

すべてのスレッドのコレクションを保持し、それらを1つずつ中断する必要がありますか、

私はあなたが必要と思うあなたの質問から。 (私の理解が正しいならば)多くのクライアントがサーバーに接続するので、clientThreadが作成されるListenForClientsというスレッドが1つしかありません。しかし、Disconnectメソッドでは、listenThreadのみが中止されます。つまり、clientThreadがまだ実行中である可能性があります。

関連する問題