我们是否必须在 azure 函数中处理垃圾收集?

Ann*_*nie 6 c# azure azure-storage

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

Mur*_*oft 3

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

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

因此,经验法则始终是处置,但是,请检查文档以获取最佳实践,尤其是在涉及连接对象时。

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

  • 对于隐藏应用程序生命周期的函数之类的内容,我将所有可重用的内容缓存为“静态”引用并以这种方式进行处理:“AppDomain.CurrentDomain.ProcessExit += (s, e) => httpClient.Dispose();” (4认同)