Нужно ли утилизировать IDisposable с таким же временем жизни, как у самого приложения? - PullRequest
1 голос
/ 14 мая 2019

У меня есть IDiposable объект, который живет "навсегда" в приложении.В моем случае это SemaphoreSlim, но вопрос действительно относится к любым объектам, которые могут быть удалены.

Я точно знаю, что мне нужен объект до тех пор, пока приложение работает.Таким образом, вопрос заключается в следующем: действительно ли мне нужно обеспечить его утилизацию или все неуправляемые ресурсы будут освобождены в любом случае, когда процесс завершится?(И Windows, и Linux, если это имеет значение).

Проблема с удалением состоит в том, что мой семафор находится глубоко в стеке, и теоретически это означает, что весь мой стек объектов должен реализовывать IDisposable только потому, что где-то тамэто семафор, который действительно никогда не нуждается в удалении.

Я хочу избежать, но не уверен в последствиях.

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Все объекты уровня ОС освобождаются с завершением процесса.Это гарантируется ОС и верно как для операционных систем Windows, так и для Linux.Кроме того, IDispisable с правильно реализованным шаблоном удаления имеет отказоустойчивый механизм, который гарантирует, что неуправляемые ресурсы возвращаются в процессе финализации.Этот процесс, однако, имеет некоторые ограничения (в частности, финализаторы предоставляются с ограниченным периодом времени, который они должны завершить).Так что в худшем случае вы можете быть уверены, что неуправляемые ресурсы не переживут ваш процесс.Конечно, не рекомендуется оставлять их без присмотра, поскольку это может привести к утечке ресурсов и памяти в случае систематического игнорирования восстановления ресурсов, но в качестве исключительного случая для одного ресурса с временем жизни, эквивалентным времени жизни приложения, это может быть приемлемым.

1 голос
/ 14 мая 2019

У меня есть IDiposable объект, который живет "навсегда" в приложении

Ну, если он должен дожить до времени жизни приложения, тогда где вопрос утилизации? Скорее освободите его во время выполнения, когда ваше приложение заканчивается или перезагружается.

все неуправляемые ресурсы в любом случае освобождаются после завершения процесса?

Да, они освобождаются после того, как ваше приложение заканчивается (процесс завершается), но до тех пор ресурс остается там, занимая память (но это то, что выглядит как ваше требование)

...