2012-01-18 14 views
3

TcpListenerを使用するコードを記述する必要があります。 TcpListenerを使用しているオブジェクトには、「聞く」、「聞くのをやめる」、「メッセージを送信する」の3つの可能性があります。これは私のコードがどのように見えるかです:C#のスレッドとTcpListener

、私は私が(falseにlistenerEnableを変更)リスナーの状態を停止したいときに私はスレッドセーフを保つことができる方法を知っているかわかりません。

また、サーバーリスナーの状態を停止せずにクライアントにメッセージを送信するときに、このスレッドを安全に保つ方法がわかりません。

ありがとうございました。

答えて

3

変数を待つのではなく、イベントを待つことをお勧めします。現在のスキームでは、リスナー変数がtrueであるかどうかのループテストが行​​われるケースを考慮してください。それがループに入り、着信接続を待ってブロックします。したがって、別のスレッドがリスナー変数をfalseに設定したとしても、誰かが接続してその接続を処理するまでループは終了しません。それは上記の接続要求に応じていない上記のループに影響を与えない送信

WaitHandle[] waitHandles = new WaitHandle[] {endlLoopEvent}; 
while(true) 
{ 
    int ret = WaitHandle.WaitAny(waitHandles, 100); 
    if(WaitTimeout == ret) continue; 
    else if(0 == ret) break; //our event has been signaled. 
    else 
    { 
     if(!server.Pending()) continue; //Go back to the loop if no connection pending 
     TcpClient client = server.AcceptTcpClient(); 
     // You can spawn a thread to service the request. 
    } 
} 

、提供:問題を回避作業の

一つの方法は、上記のコードのように持つことになります。

2

正確でスケーラブルなソケットサーバーを作成することは簡単ではありません。以前は何度も何度も行われていました。

質問に答えるには、AcceptTcpClientはブロックコールです。 BeginXXXEndXXXで始まるAPM(Asyncronous Programming Model)メソッドをMSDN BeginAcceptTcpClientのように使用することをお勧めします。

これらのメソッドはスレッドをブロックしませんが、同時実行性を処理する必要があります。

関連する問題