Я склонен использовать целое число, а не логическое значение в качестве поля для хранения удаленного состояния, потому что тогда вы можете использовать поточно-безопасный класс Interlocked, чтобы проверить, был ли вызван Dispose.
Что-то вродеthis:
private volatile int _disposeCount;
public void Dispose()
{
if (Interlocked.Increment(ref _disposeCount) == 1)
{
// disposal code here
}
}
Это гарантирует, что код удаления вызывается только один раз, независимо от того, сколько раз вызывается метод, и полностью безопасен для потоков.
Тогда каждый метод может просто использоватьвызовите этот метод как проверку барьера:
private void ThrowIfDisposed()
{
if (_disposeCount > 0) throw new ObjectDisposedException(GetType().Name);
}
Что касается синхронизации каждого метода - вы говорите, что простая проверка барьера не сработает - что вы хотите остановить другие потоки, которые уже могут быть выполнение кода в экземпляре .Это более сложная проблема.Я не знаю, что делает ваш код, но подумайте, действительно ли вам это нужно - не сработает ли простая проверка барьеров?
Если вы только что имели в виду в отношении самой удаленной проверки - мой пример выше подойдет.
РЕДАКТИРОВАТЬ: ответить на комментарий "В чем разница между этим иФлаг volatile bool? Немного сбивает с толку наличие поля с именемthingCount, позволяющего ему хранить только значения 0 и 1 "
Volatile связано с обеспечением атомарности и безопасности операции чтения или записи.Это не делает процесс присвоения и проверки значения потокобезопасным.Так, например, следующее не является потокобезопасным, несмотря на изменчивость:
private volatile bool _disposed;
public void Dispose()
{
if (!_disposed)
{
_disposed = true
// disposal code here
}
}
Проблема здесь в том, что, если два потока были близко друг к другу, первый мог проверить _disposed, прочитать false, ввести блок кода ибыть выключенным перед установкой _disposed в true.Затем второй проверяет _disposed, видит false и также входит в блок кода.
Использование Interlocked гарантирует, что как назначение, так и последующее чтение являются одной атомарной операцией.