Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Mono上奇怪的WeakReference行为_C#_Mono_Weak References - Fatal编程技术网

C# Mono上奇怪的WeakReference行为

C# Mono上奇怪的WeakReference行为,c#,mono,weak-references,C#,Mono,Weak References,使用Mono 2.11.3(SGen)和稳定的2.10.8版本测试使用WeakReference的代码失败。在这样一个简单的代码中 object obj = new object(); WeakReference wr = new WeakReference(obj); Assert.IsTrue(wr.IsAlive); obj = null; GC.Collect(); Assert.IsFalse(wr.IsAlive); 第二个断言将失败。添加GC.WaitForPendingF

使用Mono 2.11.3(SGen)和稳定的2.10.8版本测试使用WeakReference的代码失败。在这样一个简单的代码中

object obj = new object();
WeakReference wr = new WeakReference(obj);

Assert.IsTrue(wr.IsAlive);

obj = null;
GC.Collect();

Assert.IsFalse(wr.IsAlive);
第二个断言将失败。添加GC.WaitForPendingFinalizers没有帮助。这是单声道还是我脑子里的一个错误?
谢谢

这不是一个bug,而是一个实现细节,其中Mono-GC的行为与MS-GC不同。在这种情况下,由于您在同一堆栈帧中创建了对象obj,因此它恰好被保守的堆栈扫描代码保持活动状态。 在实际代码中(与像这样的琐碎测试用例相反),这不是问题。 如果您的具体情况是这样,我建议使用单独的方法分配对象及其WeakReference:

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

必须确保编译时不内联
Alloc()
方法

如果它是您头脑中的一个bug,您可以通过附加PsycholidDBG进行远程调试,但终止会话可能会致命。相关:我对下面的2/3部分失去了理解:)这个答案并不能真正回答OP的问题。考虑给你的答案增加一些解释。
[MethodImpl((MethodImplOptions.NoInlining)]
static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}