Я работаю над системой, которая требует обширного взаимодействия с 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
}
}
}
}
. Это прекрасно работает и позволяет достичь поставленной цели. Однако, поскольку любая операция взаимодействия должна быть вложена в блок using FooEnvironment, мы постоянно блокируемся, и профилирование предполагает, что на эту блокировку приходится почти 50% работы, выполняемой во время выполнения-. Мне кажется, что это достаточно фундаментальная концепция, и что-то в.NET или CLR должно решать ее. Есть ли лучший способ сделать подсчет ссылок?