2016-05-11 5 views
1

私はC#ソケットサーバーを構築しています。私のコードは現在動作していますが、これが正しい方法であるかどうかはわかりません。スレッド管理の正しい方法

TcpClientが接続されている場合は、次のメソッドを使用して新しいオブジェクトに入れます。Init()を呼び出して、データが利用可能かどうかのチェックを開始します。

public void Init() 
    { 
     ThreadPool.QueueUserWorkItem(Read); 
    } 

    private void Read(object state) 
    { 
     if (IsClientConnected()) 
     { 
      if (_connected.Available > 0) 
      { 
       OnDataAvailable(_connected.Available); 
      } 
      Init(); 
     } 
    } 

ReadInt32(), ReadByte(), ReadString() ReadObject<T>()のように、私が作成したメソッドを使用して、私はここに Whileループを使用すべきか、私が現在やっているよう Init()を再起動する必要がありますか?それで ThreadPoolの代わりに BackgroundWorker, Thread、または Taskを使用する必要がありますか?

私もBeginWait(some sort of callback here)Init()を変更し、Read()Init()の除去を考えていたし、必要な

私の目的は、コマンドに耳を傾け、コマンドに応答するのですその後、もう一度BeginWaitを呼び出します。 x個のクライアントが同時に接続されている。

ので、シナリオは以下の通りです:

私は、サーバーに接続するアプリケーションを持っています。 次に、TcpClientを新しいオブジェクトにコンストラクタのパラメータとして初期化します。次に、サーバーは、接続されたクライアントを別のクライアントがある部屋に追加します。この部屋には、ソケットを読むための正しい方法はそれから読むことです

private void Client_DataAvailable(ClientWrapper sender, int data) 
    { 
     var command = (Commands)Client.ReadByte(); 
     switch (command) 
     { 
      case Commands.RequestConnectId: // 1 

       var buffer = new WriteBuffer(Commands.RequestConnectId); 
       buffer.WriteInt32(sender.ConnectId); 
       sender.Reply(buffer); 

       break; 
      case Commands.WriteText: //2 

       var buffer = new WriteBuffer(Commands.WriteText); 
       buffer.WriteString(sender.ReadString()); 
       BroadCast(sender.ConnectId,buffer);//Send to the other client 

       break; 
     } 
    } 
+0

C#5でのスレッドを処理する正しい方法は、I/OのためAT ALLスレッドしないことです。代わりに、非同期に 'async'と' await'を使います。 – Aron

+0

私は 'async'' await'を適用するためにこれをどのようにすることができますか提案私は何をしているの詳細について私の質問を編集しています –

+0

あなたの質問はStackOverflowで受け入れられる質問の範囲を超えています。残念ながら、どのSEネットワークがこの質問に適しているかをあなたにアドバイスすることはできません。 – Aron

答えて

1

を次のクライアントのイベントDataAvailable見た目のそれぞれで待機します。データの準備が整うまで、コールは完了しません。イベントは必要ありません。 Availableプロパティはほとんど常にバグですので、それを使わないでください。

だけで実行します。

var command = (Commands)Client.ReadByte(); 

すぐ。それは、(コメントで示唆されたものとは対照的に)バックグラウンドスレッドで実行するのは良いです。あなたがあまりにも多くを持つと、スレッドは問題になります。もしあなたが数ダースのソケット接続を維持しているのであれば、問題はありません。

awaitでasync IOを使用することもできます。同じ考え方が適用されます:ただ読んでください。

コマンドのストリームを処理したい場合は、単にループでこれをラップ:

while (true) { 
ReadCommand(); 
WriteResponse(); 
} 
関連する問題