单声道奇怪的WeakReference行为(strange WeakReference behavi

2019-06-26 04:17发布

使用WeakReference的使用单声道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于事无补。 这是单声道或在我的脑海中的错误? 谢谢

Answer 1:

这是不是一个错误,但实现的细节,其中单GC从MS GC的行为不同。 在这种情况下,因为你在同一个堆栈帧创建obj对象,它发生在保守的叠加扫描代码保持活着。 在实际的代码(而不是琐碎的测试用例是这样),这是没有问题的。 如果您的具体情况是这样,我建议分配的对象和它在一个单独的方法WeakReference的:

static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}


Answer 2:

[MethodImpl((MethodImplOptions.NoInlining)]
static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}

必须确保Alloc()方法不在线时,编译



文章来源: strange WeakReference behavior on Mono