Есть ли любая точка в отслеживании классика bool disposed
поле на в других отношениях ориентированном на многопотоковое исполнение типе в целях условного броска ObjectDisposedException
в начале всех основных выставленных методов?
Я видел этот шаблон, рекомендуемый в нескольких местах онлайн, но я не уверен, используют ли авторы его правильно, таким образом, этот вопрос предполагает, что они.
В таком сценарии кажется что единственный способ гарантировать что disposed
условие верно вне оценки условия, должен использовать механизм синхронизации, такой как блокировка () по всему телу каждого подвергнутого участника включая Расположение (bool) метод. Разве это не сделало бы тип эффективно однопоточным снова?
И если бы это верно, то не было бы никакого смысла в использовании его, и поэтому Вы не можете полагаться на механизм ObjectDisposedException в некоторых реализациях IDisposable - таким образом, почему мы КОГДА-ЛИБО использовали бы этот механизм, если это не необходимо?
====
Я предполагаю IDisposable, и ObjectDisposedException просто не сочетаются для ориентированных на многопотоковое исполнение типов.
Возможно, более эффективный способ сделать так, чтобы потокобезопасный объект не удалялся во время работы метода, - это использовать ReaderWriterLockSlim
. Попросите все общедоступные методы получить блокировку чтения во время выполнения и освободить ее, когда они будут выполнены. Получите Dispose
, чтобы получить блокировку записи. Он будет ждать, пока все другие методы будут выполнены, прежде чем получит блокировку записи. Затем он устанавливает isDisposed
внутри блокировки записи, которую он исключительно удерживает. Любые вызовы общедоступных методов после выполнения Dispose
могут видеть isDisposed
и вызывать исключение ObjectDisposedException
.
ReaderWriterLockSlim
http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx
Если поведение вашего объекта будет другим, если он уже удален, и если есть вероятность, что он будет использоваться после его удаления, вам потребуется чтобы отслеживать это. Лучше выбросить ObjectDisposedException
, чем выбросить любое случайное исключение, которое произойдет, если объект уже удален, и вы не проверяете сначала.