Проблема в том, что я не хочу иметь объект GC'ed. Я хочу, чтобы он оставался как часть MessageCollection.
Вызов Dispose не приводит к тому, что объект GC'ed - это происходит, когда GC выполняет развертку, и ничто не ссылается на него. Если вы все еще ссылаетесь на объект с помощью MessageCollection, он останется на месте.
Утилизация может помешать его завершению, но поскольку вы не используете Утилиту для очистки ресурсов, у вас не будет финализатора и вам все равно.
Так что, действительно, единственная проблема заключается в сбивающей с толку семантике, связанной с тем, что ваш calss реализует IDisposable, даже если нет ресурсов для удаления.
Лично я не вижу в этом проблемы. Если потребители звонят в Dispose, то все в порядке - они получают время регистрации. Если они этого не делают, то они не получают штампы itme, и самое худшее, что происходит, - это нарушение FxCop.
Это, однако, немного неинтуитивно - поэтому, если это для публичного использования, я бы предложил предложить более обнаруживаемую альтернативу, такую как:
// C# 3+ lambda syntax
Collection.CreateNewMessage("FileDownlading", () => {
// I wonder how long it is taking me to download this file in production?
// Lets log it in a message and store for later pondering.
WebClass.DownloadAFile("You Know This File Is Great.XML");
});
// C# 2 anonymous delegate syntax
Collection.CreateNewMessage("FileDownlading", delegate() {
// I wonder how long it is taking me to download this file in production?
// Lets log it in a message and store for later pondering.
WebClass.DownloadAFile("You Know This File Is Great.XML");
});
// Method
void CreateNewMessage(string name, Action action) {
StopWatch sw = StopWatch.StartNew();
try {
action();
} finally {
Log("{0} took {1}ms", name, sw.ElapsedMilliseconds);
}
}
, который запустится и заменит время делегата Action.