Здравствуйте, <Аноним>, Вы писали:
Можно попробывать обернуть Logger.Instance в класс, унаследованный от
CriticalFinalizerObject
...all the noncritical finalizers are called before any of the critical finalizers. The finalizers are called on objects that are no longer live during the same garbage collection pass. For example, a FileStream object can run a normal finalizer to flush out existing buffered data without the risk of the handle being leaked or recycled. This very weak ordering between critical and noncritical finalizers is not intended for general use.
... << RSDN@Home 1.2.0 alpha rev. 651>>
Привет всем! Использую стороннюю библиотеку, в частности объект Logger.Instance для записи сообщений в лог. Есть у меня MainModule — это главный класс приложения, класс также реализует паттерн синлтон. Так вот я хочу чтобы, когда умирал MainModule.Instance в лог писалось некое сообщение, но беда в том, что Logger.Instance умирает быстрее и я уже обращаюсь к объекту. который был отдиспозен. Т.е. сейчас имеем примерно такой код:
private void Main()
{
MainModule main = MainModule.Instance; // Тут создание собственно моего синглтона
}
// class MainModule
public class MainModule
{
private Logger _logger = Logger.Instance; // Тут придержживаем ссылку на синглтон, но он все равно умирает раньше
private MainModule()
{
}
static MainModule()
{
}
private static MainModule _instance = new MainModule();
public static MainModule Instance
{
get { return _instance; }
}
~MainModule()
{
_logger.Instance.WriteToLog("End of work"); // Тут exception
}
}
Не использую паттерн Dispose поскольку не хочу, чтобы моему синглтону кто-то сделал Dispose
Как мне лучше сделать? Спасибо!
Порядок сбора мусора не определен.
У теб в мусор попадают и главный модуль и логгер.
Ergo, один из них умрет раньше и нет способа определить, кто именно.
Как избежать?
Например, логгер можно засунуть в статическое поле, тогда он вообще не умрет.
Еще хорошо не строить вообще логику на финализаторах, сделать модуль IDisposable, явно его диспозить и в Dispose кидать сообщение в логгер.
Вообще выкинь все финализаторы, кроме абсолютно необходимых, чтобы впредь не было таких проблем.