У нас есть последовательный порт, который подключен к сотням физических устройств на том же проводе. У нас есть протоколы как 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?
Вы можно было бы сделать так, чтобы Attach
возвращал тип, реализующий IDisposable
. Это откроет доступ к используемым членам порта, но они будут внутренне делегировать обратно исходному объекту (который публично не раскрывает ничего, кроме Attach
); вызов Attach
увеличит счетчик ссылок; удаление возвращенного значения уменьшит его. Тогда вы сможете сделать:
using (Foo foo = device.Attach(channel))
{
...
}
Следует иметь в виду одну странность: вы начинаете со счетчиком ссылок, равным 0, но без закрытия порта. Может быть, вы открываете его только при первом вызове Attach
?
Как упоминалось в ответе Jon Skeet, вы должны использовать шаблон Disposable, но, поскольку вы, похоже, используете этот класс в параллельных средах, ваши инкременты (++
) и декременты (--
) должны быть атомарными, используя Interlocked.Increment
и .Decrement
.
На самом деле вам может понадобиться объект для lock()
, чтобы вы могли увеличивать и открывать устройство, когда счетчик равен 1
(второй Attach
в тот же момент может попытаться открыть устройство снова) и уменьшать, а затем закрывать устройство, когда счетчик равен 0
.