用于管理引用计数和对象寿命的模式

时间:2010-03-18 06:26:22

标签: c# .net vb.net design-patterns oop

我们有一个串口连接到同一线路上的数百个物理设备。我们有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 World中的这个问题?

2 个答案:

答案 0 :(得分:5)

您可以考虑让Attach返回实现IDisposable的类型。这会暴露可用的端口成员,但是他们会在内部委托回原始对象(不会公开暴露Attach以外的任何东西);调用Attach会增加引用次数;处理返回的值会减少它。然后你就可以做到:

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

要记住的一个奇怪之处是,您从引用计数0开始 - 但没有关闭端口。您是否应该只在第一次Attach来电时打开它?

答案 1 :(得分:2)

正如Jon Skeet所说,你应该使用Disposable模式,但是,当你似乎在并行环境中使用这个类时,你的增量(++)和减量(--)需要原型,使用Interlocked.Increment.Decrement

事实上,您可能需要一个lock()对象,因此您可以在计数为1时递增并打开设备(同一时刻的第二个Attach可能会尝试打开再次设备)并在计数为0时递减然后关闭设备。