суббота, 20 августа 2011 г.

WaitHandle Resources

Занимаясь многопоточным программированием на платформе dotNet, нельзя не обратить внимание на совершенно ужасные примеры кода в изобилии встречающиеся в сети. Особенно бросается в глаза нежелание программистов освобождать ресурсы. И в первую очередь достается таким потомкам класса WaitHandle как Mutex и ManualResetEvent. Разработчики майкрософта не пожелали сделать публично доступный Dispose(), из чего большинство делает однозначный вывод — нечего там освобождать. Не повторяйте эту ошибку, вернуть ресурсы системе нужно. Другие же начинают извращаться различными способами, например, закрывая SafeWaitHandle. Не повторяйте эту ошибку, освобождение своих ресурсов — внутреннее дело класса.

Итак, заглянув в публично доступные исходники платформы и документацию, выяснено три способа правильной работы:

  1. using (var gate = new ManualResetEvent(false)) { … }
    Да, Dispose() не доступен публично, он доступен как метод интерфейса IDisposable и нормально отрабатывает через
    using.

  2. gate.Close();
    Да, Dispose() не доступен публично, но его функционал доступен через публичный метод Close(). Достаточно вызвать его в нужный момент.

  3. Ничего не делать, если объект должен дожить до конца работы приложения.
    Да, при выгрузке домена приложения хендл будет закрыт принудительно, ресурсы будут возвращены системе.