Представьте себе реализацию интерфейса IDisposable
, который имеет некоторые общедоступные методы.Каков правильный способ добавления безопасности потока к 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?
}
}
Я думаю, что вы смешиваете Dispose против финализаторов. Документы достаточно хорошо объясняют желаемое поведение: http: //msdn.microsoft.com/de-de/library/system.idisposable.dispose.aspx – weismat
нет, я нет, но так как вы упомянули - 'Finalize()' насколько я помню. Тем не менее, Finalize вызывается, когда нет живых ссылок на объект, поэтому безопасность потоков не должна рассматриваться тогда. В лучших практиках MS рекомендуется вызывать Dispose внутри Finalize или, по крайней мере, использовать почти ту же логику - см. [Link] (http://msdn.microsoft.com/en-us/library/fs2xkftw%28v=vs.100 % 29.aspx). В любом случае это может привести к тому, что код 'readize()' в любом случае будет вызывать код, защищенный потоками. –
Я добавил пример реализации, чтобы уточнить мой вопрос –