在C#扩展方法中订阅事件是不好的做法吗?

时间:2009-09-02 10:31:40

标签: c# events extension-methods

在这种情况下,订阅代理CloseCompleted事件是不是很糟糕?

public static void Close(this MyWCFServiceClient proxy)
{
            proxy.CloseCompleted += (o, e) =>
            {
                if (e.Error != null)
                    proxy.Abort();
            };

            proxy.CloseAsync();
}

当代理不再被任何代码引用时,它是否仍会被垃圾收集,或者扩展方法中的事件订阅是否仍然存在对代理的引用?

2 个答案:

答案 0 :(得分:5)

我不会说这是糟糕的练习,但在一般情况下它可能很明显会发生这种情况,即明确记录在{ {1}}标记。但是,在 this 的情况下,我们讨论的是对象的死亡 - 因此调用者可能在调用该方法后不希望对该对象做很多事情。我还想明确(可能在方法名称中)这是异步的。

重新垃圾收集;事件使订阅者保持活跃;不是出版商。如果///符合条件,则会收集。匿名方法似乎不访问任何捕获的范围(proxy本身除外) - 所以无论如何都没有任何有趣的事情(委托实例本身除外)。

答案 1 :(得分:1)

代理有一个对匿名代表的引用,反之亦然。因此,如果没有人引用代理,它和匿名都将被清除。