Проблема в том, что управляемый объект освобождается до того, как он станет соответствующим собственным объектом.Затем собственный объект пытается вызвать метод для управляемого объекта, и приложение вылетает.
Вероятно, вы можете сделать его более воспроизводимым, запуская GC каждую секунду:
ThreadPool.QueueUserWorkItem ((v) =>
{
while (true) {
Thread.Sleep (1000);
GC.Collect (GC.MaxGenerations);
}
});
Этогде что-то идет не так:
3 ??? 0xffffffff 0x0 + 4294967295
4 AppKit 0x04b80255 -[NSControl sendAction:to:] + 108
похоже, проблема в экземпляре NSControl (или производном).Кроме того, трудно сказать, какой объект на самом деле освобождается с помощью доступной информации.Самый простой способ выяснить это, вероятно, состоит в том, чтобы искусственно поддерживать объекты (например, добавляя их в статический список), а затем уменьшать подмножество объектов, которые вы поддерживаете, до тех пор, пока вы точно не определите точный экземпляр, который вызывает сбой.
Как только вы узнаете, какой объект преждевременно освобождается, вы должны убедиться, что сборщик мусора не освобождает его слишком рано (один из способов - добавить его в статический список, но лучший подход зависитв каждом случае).
Имейте в виду, что объект не обязательно должен быть объектом, который вы явно создаете в своем коде, он также может быть, например, делегатом или обработчиком события.