我们有一个串口连接到同一线路上的数百个物理设备。我们有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中的这个问题?
答案 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
时递减然后关闭设备。