我已经看过一些如何使用AmazonS3Client和S3Response对象的例子,从来没有见过有人打扰处理它们,这让我想知道是否有一些我不知道的隐含知识?
public class S3Response : IDisposable
{
public void Dispose();
~S3Response();
}
public class AmazonS3Client : AmazonS3, IDisposable
{
public void Dispose();
~AmazonS3Client();
}
他们都清楚地实现了IDisposable
(这告诉我自己应该自己处理它们)但是他们还指定了一个析构函数方法,它(以及前面提到的例子)让我想到我错过了什么是自动化的?
可能是析构函数在幕后调用 Dispose
吗?当然,执行这种魔术行为是不好的形式。
拥有更多Amazon S3服务经验的人是否有任何洞察力可以提供?
答案 0 :(得分:2)
首先,当对象被标记为有资格进行销毁时,C#垃圾收集器会自动调用析构函数,然后调用Finalize。请记住,可能需要很长时间才能运行GC并决定执行此操作,除了手动调用不推荐的GC之外,您无法对其进行任何实际控制。
大多数教程只显示库的基本用法,但你应该自己处理这些对象。 (或任何实现IDisposable的对象)
你当然可以用一个使用声明
来做using(var client = new AmazonS3Client())
{
// use the client here in the using scope
}
// the Dispose() is called after you leave scope of using statement
然而,一般来说,某些对象的创建(和销毁)成本很高,并且更多的意图是在多个请求的长时间内重复使用。在这种情况下(可能对于S3Client),您将保留并重新使用与S3Client相同的引用,持续时间更长,然后只需一个请求。请记住,每次实例化S3Client时,都可能使用Amazon进行身份验证,这非常耗时且昂贵。
假设您有一个使用S3Client的网站。您可能希望在整个Web请求甚至多个Web请求上重复使用相同的S3Client。您可以通过Singleton模式甚至Unity之类的依赖注入库来实现这一点,您可以定义一个对象Lifetime Manager。