C# 对同一对象的多个weakreference是否始终同步?

C# 对同一对象的多个weakreference是否始终同步?,c#,.net,multithreading,garbage-collection,C#,.net,Multithreading,Garbage Collection,如果有多个WeakReference指向同一对象,它们将始终同时被清除,或者可能不同步。举一个小例子来说明: var o = new Object(); var weak1 = new WeakReference(o); var weak2 = new WeakReference(o); for (int i = 0; i < 10000; i++) { GC.Collect(); Debug.Assert(weak1.IsAlive == weak2.IsAlive);

如果有多个WeakReference指向同一对象,它们将始终同时被清除,或者可能不同步。举一个小例子来说明:

var o = new Object();
var weak1 = new WeakReference(o);
var weak2 = new WeakReference(o);

for (int i = 0; i < 10000; i++) {
    GC.Collect();
    Debug.Assert(weak1.IsAlive == weak2.IsAlive);
}
var o=newobject();
var weak1=新的WeakReference(o);
var weak2=新的WeakReference(o);
对于(int i=0;i<10000;i++){
GC.Collect();
Assert(weak1.IsAlive==weak2.IsAlive);
}
p.S.上述截取操作运行良好(断言未触发)。此外,这些问题实际上(至少)是两个独立的问题:

  • 它们是否大致同时被清除(不是线程安全的)
  • 它们是否以线程安全的方式清除

在您的问题中,
weak1.IsAlive
始终等于
weak2.IsAlive
,因为获取当前WeakReference对象引用的对象(或者说)是否已被垃圾收集的指示。这两个WeakReference具有相同的目标对象。但是请注意,weak1/weak2本身也是引用类型,它们的引用不相等,但它们的目标是相同的。

虽然没有这样的记录,但这两个weakreference在内部分配了不同的句柄,我也不确定垃圾收集是否会清除所有弱引用。基本上,是的,它看起来确实如此,但不,我不会构建依赖它的代码。@Lasse-这就是我要寻找的信息。究竟作出了什么承诺?对同一对象有多个weakreference是个坏主意,还是?我直觉是这样的?!?我不认为保留多个引用是一个坏主意,但是如果您需要每个引用同时消失,这样您就可以保证不会在一个地方构建新实例,而在另一个地方使用旧实例,那么我肯定会尽量避免这种情况。