Странное поведение WeakReference на Mono
Тестирование кода, использующего WeakReference, не помогло мне использовать Mono 2.11.3 (SGen), а также стабильную версию 2.10.8. В простом коде, подобном этому
object obj = new object();
WeakReference wr = new WeakReference(obj);
Assert.IsTrue(wr.IsAlive);
obj = null;
GC.Collect();
Assert.IsFalse(wr.IsAlive);
второе утверждение будет терпеть неудачу. Добавление GC.WaitForPendingFinalizers не помогает. Это ошибка в Моно или в моей голове?
Благодаря
Ответы
Ответ 1
Это не ошибка, а деталь реализации, где Mono GC ведет себя иначе, чем MS GC. В этом случае, поскольку вы создали объект obj в том же стеке стека, он, как правило, поддерживается в режиме консервативного кода сканирования стека.
В реальном коде (в отличие от тривиальных тестовых случаев, подобных этому) это не проблема.
Если для вашего конкретного случая это, я предлагаю выделить объект и его WeakReference в отдельном методе:
static WeakReference Alloc ()
{
return new WeakReference (new object ());
}
Ответ 2
[MethodImpl((MethodImplOptions.NoInlining)]
static WeakReference Alloc ()
{
return new WeakReference (new object ());
}
Должен гарантировать, что метод Alloc()
не будет встроенным при компиляции