C#异步调用垃圾回收

时间:2010-03-24 17:48:34

标签: c# .net wcf asynchronous

我正在开发Silverlight / WCF应用程序,当然在Silverlight程序中有许多异步调用。我想知道如何处理客户端类和订阅的创建的最佳方法。具体来说,如果我订阅一个方法中的事件,它返回后它是否超出范围?

internal MyClass 
{
    public void OnMyButtonClicked()
    {
        var wcfClient = new WcfClient();
        wcfClient.SomeMethodFinished += OnMethodCompleted;
        wcfClient.SomeMethodAsync();
    }

    private void OnMethodCompleted(object sender, EventArgs args)
    {
        //Do something with the result

        //After this method does the subscription to the event
        //fall out of scope for garbage collection?
    }
}

如果我再次调用该函数并创建另一个订阅,我会遇到问题吗?

提前感谢任何回复的人。

2 个答案:

答案 0 :(得分:3)

您不应该让WCF客户端代理完全超出此范围。您的代码将起作用,但它也会泄漏资源。 WCF客户端都实现IDisposable,但这是一个不能只使用usingDispose的情况; Service Proxy Helper可用于同步操作,但其中的清理代码演示了如何在任何上下文中安全地处理客户端。

在进行像这样的异步操作时,需要以类似的方式管理该客户端的生命周期。通常,无论什么类“拥有”,WCF客户端都应该实现IDisposable本身,在某个私有字段中保留对该客户端的引用,并在其处理方法中调用客户端上的Close / Abort

通常,实际实现异步回调方法的类将成为所有者,因此该类应该管理生命周期;因此,如果你真的需要一个“按需”客户端,那么在回调完成后执行清理也是有意义的。

WCF客户端也不便宜创建,所以你应该尽可能长时间地保持它们并且不要像这样特别创建它们;将它们视为应用程序范围的依赖关系。

如果你只是保留客户端实例,那么你也不需要继续订阅它的事件;这个问题有效消失了。

答案 1 :(得分:2)

你不会遇到问题。它会生成一个新的WcfClient实例,两者都会在完成时调用您的OnMethodCompleted回调。