我看过许多有关如何使用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。

08-08 01:31