为了好玩,我正在尝试在 C# 中创建一个 BitTorrent 库作为一个辅助项目。但是,我遇到了一个设计问题,如果我现在不解决它可能会在以后产生问题。
我目前有一个PeerGreeter
类,它使Socket
任何尝试连接到我的对等方处于侦听状态,以便在 torrent 中为我提供文件。当一个对等点连接时,欢迎者交换握手,确保一切都有效,然后触发一个PeerConnected
事件,并将相关的Socket
握手信息作为处理程序参数。
我的Torrent
类是单个 torrent 及其所有职责的表示,有两个列表,其中包含 swarm 中的所有对等点(封装在一个Peer
对象中),连接和断开连接。当欢迎程序触发PeerConnected
事件时,实例会在断开连接列表中Torrent
找到对应的。Peer
如果找到了,它会将其移动到连接列表中,并将其实例中Connection
的类型属性设置为由欢迎程序创建的。该属性是具有访问修饰符的自动属性:Socket
Socket
{ get; internal set; }
我遇到的问题是,据我所知,这不是线程安全的。如果一个线程正在处理 a 的连接Peer
,然后另一个线程以某种方式修改该连接对象,或者将其丢弃,则可能会产生问题。我考虑过将Connection
属性的设置器的访问修饰符设置为private
,并将其设置在构造函数中,但问题是我需要创建一个新对象来替换Peer
断开连接列表中的占位符以将其添加到连接列表中。
我的问题是我应该坚持将 setter 设置为internal
,还是private
使用全新的实例替换占位符也是一种好方法?