IDisposable, ObjectDisposedException и ориентированные на многопотоковое исполнение типы

Есть ли любая точка в отслеживании классика bool disposed поле на в других отношениях ориентированном на многопотоковое исполнение типе в целях условного броска ObjectDisposedException в начале всех основных выставленных методов?

Я видел этот шаблон, рекомендуемый в нескольких местах онлайн, но я не уверен, используют ли авторы его правильно, таким образом, этот вопрос предполагает, что они.

В таком сценарии кажется что единственный способ гарантировать что disposed условие верно вне оценки условия, должен использовать механизм синхронизации, такой как блокировка () по всему телу каждого подвергнутого участника включая Расположение (bool) метод. Разве это не сделало бы тип эффективно однопоточным снова?

И если бы это верно, то не было бы никакого смысла в использовании его, и поэтому Вы не можете полагаться на механизм ObjectDisposedException в некоторых реализациях IDisposable - таким образом, почему мы КОГДА-ЛИБО использовали бы этот механизм, если это не необходимо?

====

Я предполагаю IDisposable, и ObjectDisposedException просто не сочетаются для ориентированных на многопотоковое исполнение типов.

6
задан skaffman 19 August 2010 в 08:36
поделиться

2 ответа

Возможно, более эффективный способ сделать так, чтобы потокобезопасный объект не удалялся во время работы метода, - это использовать ReaderWriterLockSlim . Попросите все общедоступные методы получить блокировку чтения во время выполнения и освободить ее, когда они будут выполнены. Получите Dispose , чтобы получить блокировку записи. Он будет ждать, пока все другие методы будут выполнены, прежде чем получит блокировку записи. Затем он устанавливает isDisposed внутри блокировки записи, которую он исключительно удерживает. Любые вызовы общедоступных методов после выполнения Dispose могут видеть isDisposed и вызывать исключение ObjectDisposedException .

ReaderWriterLockSlim

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

4
ответ дан 17 December 2019 в 00:08
поделиться

Если поведение вашего объекта будет другим, если он уже удален, и если есть вероятность, что он будет использоваться после его удаления, вам потребуется чтобы отслеживать это. Лучше выбросить ObjectDisposedException , чем выбросить любое случайное исключение, которое произойдет, если объект уже удален, и вы не проверяете сначала.

3
ответ дан 17 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: