楽しみのために、サイドプロジェクトとしてC#でBitTorrentライブラリを作成しようとしています。ただし、今対処しないと、後で問題が発生する可能性のある設計上の問題が発生しました。
私は現在、トレント内のファイルを提供するために、私に接続しようとするすべてのピアのリスニング状態にするPeerGreeter
クラスを持っています。Socket
ピアが接続すると、グリーターはハンドシェイクを交換し、すべてが有効であることを確認してからPeerConnected
、関連するSocket
ハンドシェイク情報をハンドラー引数として使用してイベントを発生させます。
Torrent
単一のトレントとそのすべての義務を表す私のクラスにはPeer
、接続および切断された、群れのすべてのピア(オブジェクトにカプセル化されている)の2つのリストがあります。グリーターがPeerConnected
イベントを発生させると、Torrent
インスタンスはPeer
切断されたリストで対応するものを見つけます。見つかった場合は、接続リストに移動し、インスタンス内Connection
のタイプのプロパティをグリーターによって作成されたものに設定します。プロパティは、アクセス修飾子が次のような自動プロパティです。Socket
Socket
{ get; internal set; }
私が抱えている問題は、私が知る限り、これはスレッドセーフではないということです。あるスレッドがの接続で動作していて、Peer
別のスレッドがその接続オブジェクトを何らかの方法で変更したり、破棄したりすると、問題が発生する可能性があります。Connection
プロパティのセッターのアクセス修飾子をprivate
に設定し、コンストラクターで設定することを検討しましたが、問題Peer
は、切断されたリストのプレースホルダーを置き換える新しいオブジェクトを作成して、接続されたリストに追加する必要があることです。
私の質問は、セッターをとして使用することに固執する必要がありますinternal
か、それともそれを作成しprivate
てプレースホルダーをまったく新しいインスタンスに置き換えることも良いアプローチですか?