Можно ли ожидать, что поток будет закрыт сборщиком мусора? - PullRequest
0 голосов
/ 11 января 2011

У меня есть класс как поток с функцией «Закрыть».Экземпляр этого класса хранится в поле / атрибуте.Иногда я должен заменить этот экземпляр на новый.К сожалению, я не могу выяснить, использует ли кто-то еще старый экземпляр объекта (многие функции многие используют это поле с многопоточностью).Поэтому я могу просто перезаписать поле, не закрывая класс.Могу ли я ожидать, что ГХ удалит незакрытый объект, или я могу закрыть его в функции удаления?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 11 января 2011

Ваш класс должен быть реализующим IDisposable, и любой пользователь этого класса должен создавать его экземпляр в выражении using .

Это обеспечит правильное закрытие / утилизацию.

GC не будет закрывать / утилизировать классы, на которые все еще есть ссылки, так что это действительно зависит от написанного вами кода и от того, как используется класс.

1 голос
/ 11 января 2011

FileStream и др. у меня есть метод Finalize (), который просто вызывает Dispose(). Хотя это правда, что это гарантирует, что маркеры в конце концов закроются, это не является детерминированным. Если вы можете вручную закрыть потоки, это очень предпочтительный метод. Метод Finalize() используется только в том случае, если поток не закрывается вручную (обычно из-за ошибки в вашей логике).

Как оказалось, даже метод Finalize() не гарантированно вызывается на 100%. Однако после выхода из программы все дескрипторы будут закрыты ОС.

1 голос
/ 11 января 2011

Вы не просто можете закрыть его с помощью метода dispose, но у вас есть , чтобы закрыть его, так как наиболее похожий поток содержит неуправляемые ресурсы, которые сборщик мусора не может принятьзабота о.Всегда Dispose классы, реализующие IDisposable, если вы закончили их использовать.

Если вы используете классы, реализующие IDisposable в классе, ваш класс должен также реализовать интерфейс.

0 голосов
/ 11 января 2011

Если у вашего класса есть финализатор, тогда да.Но, учитывая ваше описание, это не главное.

Скорее всего, вы хотите, чтобы класс реализовал IDisposable, чтобы вы могли высвобождать неуправляемые ресурсы (или собственные одноразовые экземпляры) в самое ближайшее время.*

Но, похоже, есть большие проблемы с дизайном.Учитывая, что у вас есть контроль над полем, вы должны знать , когда безопасно создавать новый экземпляр и / или когда его утилизировать.По-видимому, у вас есть несколько общих экземпляров в разных потоках, без чего-то, что имеет явное владение этим экземпляром.Без кода и более подробного описания, возможно, я ошибаюсь, но это звучит как несчастный случай, ожидающий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...