2

楽しみのために、サイドプロジェクトとしてC#でBitTorrentライブラリを作成しようとしています。ただし、今対処しないと、後で問題が発生する可能性のある設計上の問題が発生しました。

私は現在、トレント内のファイルを提供するために、私に接続しようとするすべてのピアのリスニング状態にするPeerGreeterクラスを持っています。Socketピアが接続すると、グリーターはハンドシェイクを交換し、すべてが有効であることを確認してからPeerConnected、関連するSocketハンドシェイク情報をハンドラー引数として使用してイベントを発生させます。

Torrent単一のトレントとそのすべての義務を表す私のクラスにはPeer、接続および切断された、群れのすべてのピア(オブジェクトにカプセル化されている)の2つのリストがあります。グリーターがPeerConnectedイベントを発生させると、TorrentインスタンスはPeer切断されたリストで対応するものを見つけます。見つかった場合は、接続リストに移動し、インスタンス内Connectionのタイプのプロパティをグリーターによって作成されたものに設定します。プロパティは、アクセス修飾子が次のような自動プロパティです。SocketSocket{ get; internal set; }

私が抱えている問題は、私が知る限り、これはスレッドセーフではないということです。あるスレッドがの接続で動作していて、Peer別のスレッドがその接続オブジェクトを何らかの方法で変更したり、破棄したりすると、問題が発生する可能性があります。Connectionプロパティのセッターのアクセス修飾子をprivateに設定し、コンストラクターで設定することを検討しましたが、問題Peerは、切断されたリストのプレースホルダーを置き換える新しいオブジェクトを作成して、接続されたリストに追加する必要があることです。

私の質問は、セッターをとして使用することに固執する必要がありますinternalか、それともそれを作成しprivateてプレースホルダーをまったく新しいインスタンスに置き換えることも良いアプローチですか?

4

1 に答える 1

2

スレッドセーフの目的で、型を可能な限り不変にすることで、多くの頭痛の種を減らすことができます。アクセサをプライベートにし(または、フィールドをとしてマークしますreadonly)、変更が必要な場合は新しいインスタンスを生成します。

于 2009-11-08T23:26:16.117 に答える