РЕДАКТИРОВАТЬ Да, я неправильно прочитал часть о разделении утилизации управляемых и неуправляемых ресурсов (все еще на первой чашке кофе).
Однако блокировка по-прежнему почти наверняка не нужна. Да, во время пассивного удаления код будет выполняться в потоке финализатора, который отличается от потока, в котором он изначально работал. Однако, если объект завершается таким способом, CLR уже определил, что нет никаких ссылок на этот объект и, следовательно, собрал его. Таким образом, нет другого места, которое может вызывать ваше распоряжение в то время, и, следовательно, нет причин для блокировки.
Пара других стилевых комментариев.
Зачем делать методы абстрактными? Тем самым вы заставляете производные классы реализовывать методы для удаления управляемых и неуправляемых ресурсов, даже если у них нет таких ресурсов. Правда нет смысла выводить из этого класса, если вам нечего распоряжаться. Но я думаю, что довольно распространено иметь только одно или другое, но не оба. Я бы сделал их виртуальными против абстрактных.
Также вы предотвращаете двойную утилизацию, но ничего не делаете, чтобы предупредить разработчика о том, что он дважды удаляет объект. Я понимаю, что документация MSDN гласит, что двойное удаление должно быть по существу запретом, но в то же время при каких обстоятельствах это должно быть законно? В общем, плохая идея получить доступ к объекту после его удаления. Двойное удаление требует повторного использования удаленного объекта и, вероятно, является ошибкой (это может произойти, если завершение не подавлено в активном удалении, но это также плохая идея). Если бы я реализовывал это, я бы выбрал двойную утилизацию, чтобы предупредить разработчика, что он использует объект неправильно (то есть использует его после того, как он уже был удален).