【问题标题】:C# Async call garbage collectionC# 异步调用垃圾回收
【发布时间】:2010-03-24 17:48:33
【问题描述】:

我正在开发一个 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?
    }
}

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

提前感谢任何回复的人。

【问题讨论】:

标签: c# .net wcf asynchronous


【解决方案1】:

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

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

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

创建 WCF 客户端也不便宜,因此您实际上应该尽可能长时间地保留它们,而不是像这样临时创建它们;将它们视为应用程序范围的依赖项。

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

【讨论】:

  • +1,因为这似乎是正确的建议,但从长远来看,它真的会泄漏资源吗?还是会在某个时候最终确定?
  • 感谢您的回复。我认为批准的方法是在班级级别创建它,这几乎证实了这一点。似乎我在订阅和取消订阅用户可能使用或不使用的事件时做错了。
  • @Daniel Earwicker:当然,一切最终都会最终确定——SqlConnectionBitmap 也是如此——问题是何时。如果您持有非托管资源(套接字、互斥体、句柄等),如果您不释放它们,最终可能会导致系统挨饿,因为 GC 只会在需要 内存时启动>.
  • @Troy:关于事件,您需要记住的主要一点是,只要 source 订阅一个事件,subscriber 就会保持活动状态是活着的,这有时会使垃圾收集复杂化。本质上,您只需要确保在适当的情况下取消订阅事件;如果您“拥有”您正在订阅的内容,则通常不需要取消订阅,但如果您从外部世界引用它,您确实需要在完成后取消订阅。
  • @Aaronaught - 抱歉,我不清楚。我的问题是关于 WCF 客户端类是否具有终结器 - 您似乎暗示它没有,我对实现 IDisposable 但没有终结器的类的示例感兴趣。 (你说 everything 都会被终结是错误的;并非所有 IDisposable 的对象都有终结器)。
【解决方案2】:

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

【讨论】:

  • “两者”这个词是什么意思?
  • @Daniel,“如果我再次调用该函数并创建另一个订阅”
猜你喜欢
  • 2011-11-29
  • 2021-12-20
  • 1970-01-01
  • 2015-06-10
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
相关资源
最近更新 更多