Я использую COM-объект из .NET с помощью взаимодействия.Объект в основном выбирает данные из сокета и запускает некоторые события для уровня .NET для обработки.Однако через некоторое время COM-объект перестает запускать события, которые позже выясняются из-за того, что он собран GC.
Структура исходного кода аналогична приведенной ниже:
static void Main(string[] args)
{
MyEventGen gen = new MyEventGen();
WeakReference wr = new WeakReference(gen);
gen.ReceiveDataArray +=
new _IMyEventGenEvents_ReceiveDataArrayEventHandler(gen_ReceiveDataArray);
while (true)
{
Thread.Sleep(1000);
Console.WriteLine(wr.IsAlive);
}
}
static void gen_ReceiveDataArray(ref Array indices, ref Array values)
{
// do nothing
}
Что я знаю до сих пор:
Из того, что я понимаю, объект gen
никоим образом не должен собираться мусором. Поскольку объект все еще активен в области действия Main
.Но результат пока показывает, что объект был собран GC.
Объект собирается только при сборке мусора как Выпуск и запуск без отладки .Запуск отладочных сборок / запуск обоих режимов в отладчике - это нормально.
Программа напечатает первый «False» точно после первой коллекции Gen # 0 .
Получив доступ к объекту в цикле while
, например, Console.WriteLine(gen.ToString())
, защитите его от GC'd!
Добавив еще одинСтатическое поле класса Program
для сохранения его ссылки также предотвращает его от GC'd.
Пытаясь с различной загрузкой данных, я обнаружил, что GC собирает объект только тогда, когда частные байты достигаютсвыше порога ~ 3X МБ.
При проверке с помощью CLRProfiler указанный объект был GC'd как подозреваемый.
Я пропустил некоторые важные концепции .NET GC?Можно ли получить причину того, что объект был GC'd?Возможно, это известная ошибка GC?
Я использую VS 2008 + .NET 3.5 SP1.Цените ваши мысли.Спасибо!