2

为了好玩,我正在尝试在 C# 中创建一个 BitTorrent 库作为一个辅助项目。但是,我遇到了一个设计问题,如果我现在不解决它可能会在以后产生问题。

我目前有一个PeerGreeter类,它使Socket任何尝试连接到我的对等方处于侦听状态,以便在 torrent 中为我提供文件。当一个对等点连接时,欢迎者交换握手,确保一切都有效,然后触发一个PeerConnected事件,并将相关的Socket握手信息作为处理程序参数。

我的Torrent类是单个 torrent 及其所有职责的表示,有两个列表,其中包含 swarm 中的所有对等点(封装在一个Peer对象中),连接和断开连接。当欢迎程序触发PeerConnected事件时,实例会在断开连接列表中Torrent找到对应的。Peer如果找到了,它会将其移动到连接列表中,并将其实例中Connection的类型属性设置为由欢迎程序创建的。该属性是具有访问修饰符的自动属性:SocketSocket{ get; internal set; }

我遇到的问题是,据我所知,这不是线程安全的。如果一个线程正在处理 a 的连接Peer,然后另一个线程以某种方式修改该连接对象,或者将其丢弃,则可能会产生问题。我考虑过将Connection属性的设置器的访问修饰符设置为private,并将其设置在构造函数中,但问题是我需要创建一个新对象来替换Peer断开连接列表中的占位符以将其添加到连接列表中。

我的问题是我应该坚持将 setter 设置为internal,还是private使用全新的实例替换占位符也是一种好方法?

4

1 回答 1

2

出于线程安全的目的,使类型尽可能不可变将为您节省很多很多麻烦。将访问器设为私有(或者更好的是,将该字段标记为readonly)并在需要进行更改时生成新实例。

于 2009-11-08T23:26:16.117 回答