【问题标题】:Do we have to take care of Garbage collection in azure function?我们是否必须在 azure 函数中处理垃圾收集?
【发布时间】:2018-02-23 10:15:44
【问题描述】:

我正在使用 blob 和队列存储、redis chache、documentdb 和 azure sql 数据库并创建 CloudStorageAccount、客户端和容器对象。这些类是否实现了 IDisposable。我是否必须使用“使用”或尝试 finally 块来释放对象/将其设置为 null?

【问题讨论】:

    标签: c# azure azure-storage


    【解决方案1】:

    不幸的是,这不是一个直接的答案。有些确实实现了IDisposable,有些则没有。在一般的 .net 实践中,您应该始终处理一次性对象,无论是在 finally 中还是通过使用模式。这与您是否编写 Azure 函数、WebApp 或控制台应用程序等无关。您不需要将对象设置为 null,处置就足够了。只有非托管对象需要“清空”,这将在调用的Dispose() 方法中完成。 See the IDisposable pattern.

    然而,事情并不是那么直截了当。例如,CosmosDB 连接实现IDisposable 但建议创建单个实例 /singleton 用于您的应用程序,因为客户端是线程安全的,并且多个客户端实例可能会导致多线程实现中的线程耗尽,因此您不希望每次使用都包含在 using 子句中。处置变得不那么重要了,因为对象的生命周期与 App 域的生命周期相同(或接近)。

    因此,经验法则始终是 dispose,但是,请查看文档以获得最佳实践,尤其是在连接对象方面。

    @McGuireV10 在 cmets 中提出了一个很好的观点和建议。您需要注意,一个函数的许多实例可能在托管应用程序域的同一个实例中执行。每个函数都是一个实例化,而不是一个新的应用程序域(随着函数的扩展/移动/更改运行状况定期发生)

    【讨论】:

    • 对于隐藏应用程序生命周期的函数之类的东西,我将任何可重用的内容缓存为static 引用并以这种方式处理:AppDomain.CurrentDomain.ProcessExit += (s, e) => httpClient.Dispose();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2021-05-25
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多