我看过许多有关如何使用AmazonS3Client和S3Response对象的示例,但从未见过有人为处理它们而烦恼,这让我怀疑是否存在一些我不知道的隐含知识?
public class S3Response : IDisposable
{
public void Dispose();
~S3Response();
}
public class AmazonS3Client : AmazonS3, IDisposable
{
public void Dispose();
~AmazonS3Client();
}
它们都清楚地实现了
IDisposable
(告诉我应该自己处置它们),但它们还指定了一个析构函数方法,该方法(连同上述示例)使我认为我错过了一些自动魔术师吗? 可能是析构函数在后台调用
Dispose
吗? 当然,执行这种不可思议的行为是不好的形式。对Amazon S3服务有更多经验的人是否有任何见解?
最佳答案
首先,当对象被标记为可以销毁时,C#垃圾收集器会自动调用析构函数,然后调用Finalize。请记住,GC可能需要很长时间才能运行并决定执行此操作,除了手动调用不建议使用的GC外,您对此没有任何实际控制。
大多数教程仅显示了这些库的最基本用法,但是您绝对应该自己处置这些对象。 (或任何实现IDisposable的对象)
您当然可以在using语句中做到这一点
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这样的依赖注入(inject)器库来实现,您可以定义一个对象Lifetime Manager。