Занимаясь многопоточным программированием на платформе dotNet, нельзя не обратить внимание на совершенно ужасные примеры кода в изобилии встречающиеся в сети. Особенно бросается в глаза нежелание программистов освобождать ресурсы. И в первую очередь достается таким потомкам класса WaitHandle как Mutex и ManualResetEvent. Разработчики майкрософта не пожелали сделать публично доступный Dispose(), из чего большинство делает однозначный вывод — нечего там освобождать. Не повторяйте эту ошибку, вернуть ресурсы системе нужно. Другие же начинают извращаться различными способами, например, закрывая SafeWaitHandle. Не повторяйте эту ошибку, освобождение своих ресурсов — внутреннее дело класса. Итак, заглянув в публично доступные исходники платформы и документацию, выяснено три способа правильной работы:
-
using (var gate = new ManualResetEvent(false)) { … }
Да, Dispose() не доступен публично, он доступен как метод интерфейса IDisposable и нормально отрабатывает через using. -
gate.Close();
Да, Dispose() не доступен публично, но его функционал доступен через публичный метод Close(). Достаточно вызвать его в нужный момент. -
Ничего не делать, если объект должен дожить до конца работы приложения.
Да, при выгрузке домена приложения хендл будет закрыт принудительно, ресурсы будут возвращены системе.
0 коммент.:
Отправить комментарий