ReRegisterForFinalize SuppressFinalize пример из реальной жизни - PullRequest
6 голосов
/ 22 октября 2011

Я только что читал эту статью Джеффри Рихтера « Сборка мусора: автоматическое управление памятью в Microsoft .NET Framework », и я не мог придумать ни одного реального примера использования ReRegisterForFinalize или SuppressFinalize.

Может ли кто-нибудь дать мне несколько примеров?

Ответы [ 3 ]

10 голосов
/ 22 октября 2011

Множество мест, в которых он используется в .NET Framework, всегда хорошее место для поиска. Основные модели:

  • удаленный объект повторно используется. Метод Dispose () вызвал SuppressFinalize, поэтому его необходимо перерегистрировать (класс NativeWindow, RequestContextBase, TaskExceptionHolder)
  • финализатор завершился ошибкой и обнаружил исключение. Мало что нужно сделать, но повторить позже. Этот код обернут в if (! Environment.HasShutdownStarted &&! AppDomain.CurrentDomain.IsFinalizingForUnload ()), чтобы убедиться, что это имеет смысл (классы DynamicResolver и LoaderAllocatorScout)
  • объект участвует в схеме кэширования и повторно кэшируется (класс OverlappedData)
4 голосов
/ 22 октября 2011

Для реализации IDisposable часто требуется SuppressFinalize: посмотрите код здесь или здесь .

У меня нет хорошего примераReRegisterForFinalize сейчас.

1 голос
/ 22 октября 2011

Вам нужно ReRegisterForFinalize при воскрешении экземпляра.Воскрешение (упомянутое в связанной статье) - это действие повторного укоренения объекта от его деструктора (финализатора).

Это только переносит вопрос на «когда бы вы воскресили объект».В моем ответе на этот вопрос я предположил, что пул соединений или подобная конструкция может использовать его.

...