0

私が取り組んでいるTCPサーバープロジェクトがあります。指定されたポートで接続を非同期にリッスンし、新しい接続を受け入れて、それらからのデータの待機を開始します。新しいクライアントはそれぞれ、接続時に ID を送信します。これにより、どのソケットがどのクライアントに属しているかがわかります。

最低 100000 のクライアントが同時にサーバーに接続されます。

問題は、これらのクライアントをどのように保管すればよいかということです。

class Client
{
    public Socket Socket { get; set; }
    public int ID { get; set; }
}

スレッドセーフなタイプではないため、次のようなものList<Client>は間違いなく壊れます。List<T>サーバーに接続するときにクライアントをリストに追加し、接続が失われたときにリストから削除する必要があります。また、たとえば ID が 5 のクライアントにメッセージを送信できるようにする必要がありますがList<T>、非同期環境で a を繰り返すのはひどい考えです。コレクションと対話する必要があるたびに同期ルートをロックしても、パフォーマンスに関しては何の役にも立たないと思います。

では、パフォーマンスには何を使用すればよいでしょうか。

編集: .NET 4を使用しています

4

2 に答える 2

3

ID をキーとしてスレッドセーフな辞書を使用します。.net 4 を使用している場合は、System.Collections.Concurrent.ConcurrentDictionary を使用できます。そうでない場合は、自分で作成するか、この URL をチェックして、リーダー/ライター ロックを使用する適切な URL を探してください。

http://devplanet.com/blogs/brianr/archive/2008/09/26/thread-safe-dictionary-in-net.aspx

于 2012-07-02T12:06:16.190 に答える
0

代わりにList<Client>を使用する必要がありますDictionary<int, Client>。これにより、1 行のコードで任意の ID のクライアントにアクセスできます。

 Dictionary<int, Client> connected = new Dictionary<int, Client>();
 Client cc = connected[5];
 byte[] data = new byte[100]; // any data here
 cc.SendData(data);
于 2012-07-02T12:08:09.003 に答える