2009-11-08 77 views
2

我試圖在C#中創建一個BitTorrent庫作爲一個側面項目,爲了好玩。但是,如果我現在沒有解決問題,我會遇到一個設計問題,以後可能會產生問題。創建一個對象的新實例,或修改現有的實例?

我目前有一個PeerGreeter類,它使Socket處於偵聽狀態,以便任何嘗試連接到我的同伴在我的文件中爲我提供文件。當對端連接時,迎賓人員交換握手信息,確保所有內容都有效,然後使用關聯的Socket和握手信息作爲處理程序參數觸發PeerConnected事件。

我的Torrent類,它是一個單一洪流及其所有職責的代表,它有兩個列表,包括羣集中的所有對等點(封裝在一個Peer對象中),已連接和斷開連接。當迎賓人觸發PeerConnected事件時,Torrent實例將在斷開連接的列表中找到相應的Peer。如果它找到一個,它將它移動到連接列表中,並在其實例中將SocketConnection屬性設置爲由歡迎者創建的Socket。該屬性是一個自動屬性與訪問修飾符爲:{ get; internal set; }

我遇到的問題是,據我所知,這是不是線程安全的。如果一個線程正在使用Peer的連接,然後另一個線程以某種方式修改了該連接對象,或者將其丟棄,則可能會產生問題。我曾考慮將Connection屬性的setter的訪問修飾符設置爲private,並將其設置在構造函數中,但問題是我需要創建一個新對象來替換斷開列表中的佔位符Peer以將其添加到連接列表。

我的問題是我應該堅持使用setter作爲internal,還是讓它成爲private並用一個全新的實例替換佔位符,這也是一個好方法嗎?

回答

2

爲了線程安全的目的,儘可能將類型設置爲不可變的將爲您節省很多很多的麻煩。使訪問器保密(或者更好的是,將該字段標記爲readonly),並在需要進行更改時生成新的實例。

相關問題