Шаблон для управления подсчетом ссылок и объектной жизнью

У нас есть последовательный порт, который подключен к сотням физических устройств на том же проводе. У нас есть протоколы как Modbus и Hart для обрабатывания запроса и ответа между приложением и устройствами. Вопрос связан с управлением подсчетом ссылок канала. Когда никакое устройство не использует канал, канал должен быть закрыт.

public class SerialPortChannel
{ 
   int refCount = 0;
   public void AddReference()
   {
      refCount++;
   }   


   public void ReleaseReference()
   {
      refCount--;
      if (refCount <= 0)
           this.ReleasePort(); //This close the serial port
   }   

}

Для каждого подключенного устройства мы создаем объект для устройства как

  device = new Device();
  device.Attach(channel);    //this calls channel.AddReference()

Когда разъединение устройства,

  device.Detach(channel); //this calls channel.ReleaseReference()

Я не убежден моделью подсчета ссылок. Там какой-либо лучший путь состоит в том, чтобы решить эту проблему в Мире.NET?

5
задан 18 March 2010 в 06:26
поделиться

2 ответа

Вы можно было бы сделать так, чтобы Attach возвращал тип, реализующий IDisposable . Это откроет доступ к используемым членам порта, но они будут внутренне делегировать обратно исходному объекту (который публично не раскрывает ничего, кроме Attach ); вызов Attach увеличит счетчик ссылок; удаление возвращенного значения уменьшит его. Тогда вы сможете сделать:

using (Foo foo = device.Attach(channel))
{
    ...
}

Следует иметь в виду одну странность: вы начинаете со счетчиком ссылок, равным 0, но без закрытия порта. Может быть, вы открываете его только при первом вызове Attach ?

5
ответ дан 14 December 2019 в 08:47
поделиться

Как упоминалось в ответе Jon Skeet, вы должны использовать шаблон Disposable, но, поскольку вы, похоже, используете этот класс в параллельных средах, ваши инкременты (++) и декременты (--) должны быть атомарными, используя Interlocked.Increment и .Decrement.

На самом деле вам может понадобиться объект для lock(), чтобы вы могли увеличивать и открывать устройство, когда счетчик равен 1 (второй Attach в тот же момент может попытаться открыть устройство снова) и уменьшать, а затем закрывать устройство, когда счетчик равен 0.

2
ответ дан 14 December 2019 в 08:47
поделиться