Представьте себе реализацию интерфейса IDisposable
, который имеет некоторые общедоступные методы.
Если экземпляр этого типа разделяется между несколькими потоками, и один из потоков может его уничтожить, что является лучшим способом обеспечить, чтобы другие потоки не пытались работать с экземпляром после его удаления? В большинстве случаев, после размещения объекта, его методы должны знать об этом и бросать ObjectDisposedException
или, возможно, InvalidOperationException
, или, по крайней мере, информировать вызывающий код о том, что что-то не так. Мне нужна синхронизация для метода каждый - особенно вокруг проверки, если она удалена? Все ли реализации IDisposable
с другими общедоступными методами должны быть потокобезопасными?
Вот пример:
public class DummyDisposable : IDisposable
{
private bool _disposed = false;
public void Dispose()
{
_disposed = true;
// actual dispose logic
}
public void DoSomething()
{
// maybe synchronize around the if block?
if (_disposed)
{
throw new ObjectDisposedException("The current instance has been disposed!");
}
// DoSomething logic
}
public void DoSomethingElse()
{
// Same sync logic as in DoSomething() again?
}
}