Я бы сделал это так, как вы предлагаете. Нет необходимости использовать dosync
& amp; alter
с ref
для этого. Просто используйте локальный atom
в каждом model
. Это может быть тогда GC'd, когда модель больше не используется.
Обновление
Одной из альтернатив Java является использование LinkedHashMap. Вы можете установить максимальный размер и переопределить функцию removeEldestEntry()
для управления поведением.
Обратите внимание, что этот синтаксис немного отключен, но я уверен, что вы знаете, как его исправить:
((deref...
Обычно объекты должны внутренне обработать несколько Dispose()
вызовы, и только делают основной код однажды; так потоковое получение Dispose()
d многократно не обычно проблема. Лично, я использовал бы много из using
там; обратите внимание, что Вы не должны делать отступ/вкладывать, хотя (если разные уровни не имеют различное время жизни):
using(TcpClient tcpClient = new TcpClient("url.com", 80))
using(NetworkStream tcpStream = tcpClient.GetStream())
using(StreamReader tcpReader = new StreamReader(tcpStream))
using(StreamWriter tcpWriter = new StreamWriter(tcpStream))
{
...
}
Как Вы говорите, это гарантирует, что, если ошибка происходит во время инициализации, все все еще очищено правильно. Это также гарантирует, что каждый уровень заставляет шанс (в правильном порядке) иметь дело правильно с любыми буферизированными данными и т.д.
Владение ре; NetworkStream
на самом деле причуда, во-первых... большинство потоков или вводится вывод xor. NetworkStream
изгибы несколько правил и контейнеров два направления в один API; таким образом, это - исключение... обычно владение было бы более ясным. Кроме того, много оберток имеют флаг, чтобы определить, должны ли они закрыть перенесенный поток. StreamReader
не делает, но некоторые делают (такой как GZipStream
, который имеет a leaveOpen
опция ctor). Если Вы не хотите течь владение, это - опция - или используйте незаключительного потокового посредника - каждый здесь (NonClosingStream
или подобный).
Книги ре; я забрал копию "Сокетов TCP/IP в C#: Практическое Руководство для Программистов" (здесь) - соответствующий, но не большой.
Если поддержка объектов IDisposable, лучше помещать его в использование {} блок, потому что расположить метод называют автоматически для Вас. Это также делает для меньшего количества кода с Вашей стороны. Важно отметить, что использование 'использования' не обрабатывает исключений. Все еще необходимо сделать это, если Вы хотите обработать какие-либо ошибки. После того как блок использования выходит из объема, Ваш объект - также.
Old Style Code
object obj;
try
{
obj= new object();
//Do something with the object
}
catch
{
//Handle Exception
}
finally
{
if (obj != null)
{
obj.Dispose();
}
}
Newer Style Code
try
{
using (object obj = new object())
{
//Do something with the object
}
catch
{
//Handle Exception
}
Что относительно сокетов? Это - OK, чтобы сделать:
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Connect(serverEndPoint, m_NegotiationPort);
.
.
.
serverSocket.Close();
или лучше
using (Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
{
.
.
.
}