C#使用弱引用收听第三方长寿事件

C#使用弱引用收听第三方长寿事件,c#,weak-events,C#,Weak Events,我正在连接一个第三方的、长期存在的已删除事件发布服务器,由于事件处理程序的存在,它最终使我可能存在的短期对象保持活动状态。删除的事件很可能从未触发过,如果触发了,我只需要处理它。从已删除事件中取消订阅的位置不明显,因此我希望对其进行弱引用,以便可以对我的对象进行GC 我已经看到了许多创建弱事件处理程序的非常详细的方法,但是下面的代码段似乎可以做到这一点,至少在提供的测试代码段中是这样。这是疯了还是能用 (在“第一次尝试”中说,类似的代码片段“(…)不够健壮,无法用于事件(…)”,为什么不呢?)

我正在连接一个第三方的、长期存在的已删除事件发布服务器,由于事件处理程序的存在,它最终使我可能存在的短期对象保持活动状态。删除的事件很可能从未触发过,如果触发了,我只需要处理它。从已删除事件中取消订阅的位置不明显,因此我希望对其进行弱引用,以便可以对我的对象进行GC

我已经看到了许多创建弱事件处理程序的非常详细的方法,但是下面的代码段似乎可以做到这一点,至少在提供的测试代码段中是这样。这是疯了还是能用

(在“第一次尝试”中说,类似的代码片段“(…)不够健壮,无法用于事件(…)”,为什么不呢?)

因为
操作处理程序
可能会在其目标被删除之前进行垃圾收集。下面是一个暴露问题的单元测试:

public class Bar
{
    public void Foo(object sender, EventArgs args)
    {
    }
}

[Test]
public void ActionIsNotGCedBeforeTarget()
{
    Bar bar = new Bar();
    Action<object, EventArgs> action = bar.Foo;
    WeakReference weakRef = new WeakReference(action);
    action = null;
    GC.Collect();

    Assert.IsTrue(weakRef.IsAlive); // Will be false
}
公共类栏
{
public void Foo(对象发送方、事件args args)
{
}
}
[测试]
public void ActionIsNotGCedBeforeTarget()
{
条形=新条形();
动作=bar.Foo;
WeakReference weakRef=新的WeakReference(操作);
action=null;
GC.Collect();
Assert.IsTrue(weakRef.IsAlive);//将为false
}
因为
操作处理程序
可能会在其目标被删除之前进行垃圾收集。下面是一个暴露问题的单元测试:

public class Bar
{
    public void Foo(object sender, EventArgs args)
    {
    }
}

[Test]
public void ActionIsNotGCedBeforeTarget()
{
    Bar bar = new Bar();
    Action<object, EventArgs> action = bar.Foo;
    WeakReference weakRef = new WeakReference(action);
    action = null;
    GC.Collect();

    Assert.IsTrue(weakRef.IsAlive); // Will be false
}
公共类栏
{
public void Foo(对象发送方、事件args args)
{
}
}
[测试]
public void ActionIsNotGCedBeforeTarget()
{
条形=新条形();
动作=bar.Foo;
WeakReference weakRef=新的WeakReference(操作);
action=null;
GC.Collect();
Assert.IsTrue(weakRef.IsAlive);//将为false
}
public class Bar
{
    public void Foo(object sender, EventArgs args)
    {
    }
}

[Test]
public void ActionIsNotGCedBeforeTarget()
{
    Bar bar = new Bar();
    Action<object, EventArgs> action = bar.Foo;
    WeakReference weakRef = new WeakReference(action);
    action = null;
    GC.Collect();

    Assert.IsTrue(weakRef.IsAlive); // Will be false
}