2015-10-08 2 views
0

У меня есть объект, который содержит поток файлов. Файловый поток должен быть открыт для времени жизни объекта. Я хочу, чтобы поток файлов закрывался, когда у объекта больше нет ссылок, но никогда не до этого. Если Dispose() вызывается на объект, файл будет удален, но объект все еще может иметь ссылки. Вызов других методов после этой точки не будет безопасным, потому что файл будет удален, поэтому мне нужно будет выполнить проверку в начале каждого метода, чтобы убедиться, что файл по-прежнему действителен (трата времени выполнения).Выполнение IDispose :: Dispose() private

Может показаться, что решение Dispose() будет разрешать эту проблему, но опять же, я понимаю, что деструктор не может быть вызван немедленно, когда объект не имеет больше ссылок, поэтому я ДОЛЖЕН выставить Dispose () метод для вызывающего сделать свою собственную очистку. Разве это не разрушает цель «умного» управления памятью, и существует ли какой-либо способ этого?

+0

Значит, вы не доверяете пользователям объекта только Dispose, когда им больше не нужен объект? Почему бы не просто повторно открыть файл, если 'Dispose' был вызван ранее? –

+0

Вам не нужно делать это вручную. AOP может ввести вызов: https://github.com/Fody/Janitor – Mitch

+0

Это будет проверка, чтобы проверить, был ли файл ранее установлен. Было бы лучше, если бы объект мог предположить, что файл всегда открыт. Нет ненужных условностей. – Lemming

ответ

1

Если ссылок на ваш объект больше нет, это будет сбор мусора вместе с внутренним файловым потоком. Во время GC будет запущен file stream's finalizer, и файл будет закрыт. Для этого вам не нужен Dispose(). Проблема в том, что вы не знаете, когда GC будет работать. Кажется, что ваш объект имеет долгую жизнь, поэтому он, вероятно, будет в generation 2. Для запуска генератора Gen 2 потребуется много времени.

Вы должны реализовать IDisposable и проверить состояние своего объекта перед каждым звонком. Если объект был удален, бросьте ObjectDisposedException.

Смежные вопросы