我正在开发一个需要大量使用C API的系统。其中一部分是在任何操作之前和之后对该系统进行初始化和关闭。如果无法完成这两个步骤,将导致系统不稳定。我通过在核心可释放环境类中实现引用计数来实现此操作,如下所示:
public FooEnvironment()
{
lock(EnvironmentLock)
{
if(_initCount == 0)
{
Init(); // global startup
}
_initCount++;
}
}
private void Dispose(bool disposing)
{
if(_disposed)
return;
if(disposing)
{
lock(EnvironmentLock)
{
_initCount--;
if(_initCount == 0)
{
Term(); // global termination
}
}
}
}
这样做很好,并且完成了目标。 但是,由于任何interop操作都必须嵌套在FooEnvironment using块中,我们一直处于锁定状态,并且分析表明,此锁定占据运行时工作量的近50%。 看起来这是一个足够基本的概念,.NET或CLR中必须解决它。 有更好的方法来进行引用计数吗?
Interlocked.Increment
(以及相关方法)是您正在寻找的吗? - harold