Сетевое программирование C# и использование ресурсов

Я бы сделал это так, как вы предлагаете. Нет необходимости использовать dosync & amp; alter с ref для этого. Просто используйте локальный atom в каждом model. Это может быть тогда GC'd, когда модель больше не используется.


Обновление

Одной из альтернатив Java является использование LinkedHashMap. Вы можете установить максимальный размер и переопределить функцию removeEldestEntry() для управления поведением.


Обратите внимание, что этот синтаксис немного отключен, но я уверен, что вы знаете, как его исправить:

((deref...

7
задан Erik Funkenbusch 2 April 2009 в 18:43
поделиться

3 ответа

Обычно объекты должны внутренне обработать несколько 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#: Практическое Руководство для Программистов" (здесь) - соответствующий, но не большой.

14
ответ дан 6 December 2019 в 19:43
поделиться

Если поддержка объектов 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
}
0
ответ дан 6 December 2019 в 19:43
поделиться

Что относительно сокетов? Это - 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)
{
.
.
.
}
-1
ответ дан 6 December 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: