Сессия, содержащая элементы, реализующие IDisposable - PullRequest
7 голосов
/ 31 января 2009

В ASP.NET, если элементы остаются в состоянии сеанса, которые реализуют IDisposable, но никогда не удаляются и не удаляются приложением по окончании сеанса, будет ли вызываться метод Dispose для объектов, которые будет выполнять любой код в Dipose ()?

Ответы [ 3 ]

10 голосов
/ 31 января 2009

Я бы не согласился с ответом Шона; во-первых, финализаторы должны не регулярно добавляться в классы, даже если они IDisposable - финализаторы должны действительно использоваться только в классах, которые представляют неуправляемые ресурсы. И наоборот, класс с финализатором часто также IDisposable.

По вопросу: Dispose() называется - нет, это не так. Объект будет собирать мусор в какой-то момент в будущем (неопределенный), но это все. Финализатор не будет добавлять сюда много, так как любые инкапсулированные объекты также уже будут иметь право на сбор (при условии, что на них нет ссылок в другом месте).

2 голосов
/ 31 января 2009

Если шаблон IDisposable реализован правильно , то да (т. Е. Деструктор класса позаботится об удалении объекта). Я не верю, что менеджер сеансов ASP.NET дает какие-либо гарантии о явном вызове Dispose() для классов, реализующих IDisposable.

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

1 голос
/ 31 января 2009

Я был бы обеспокоен наличием одноразовых объектов в сеансе. Это почти наверняка создаст проблему масштабируемости для вас. Все, что может быть удалено, вероятно, связано с каким-то ограниченным ресурсом. Если у вас много активных сеансов, вы, вероятно, будете использовать этот ресурс. Во-вторых, я ожидаю, что многие (большинство?) Одноразовые объекты не будут хорошо работать в веб-ферме, так как ресурс, к которому они привязаны, вероятно, является локальным для одной машины, и они не будут сериализованы, а затем десериализованы на другой машине в той же машине. состояние.

...