处置 AmazonS3Client 和 S3Response

gin*_*boy 6 c# idisposable amazon-s3

我看过许多有关如何使用 AmazonS3Client 和 S3Response 对象的示例,但从未见过有人费心处理它们,这让我想知道是否有一些我遗漏的隐含知识?

public class S3Response : IDisposable
{
    public void Dispose();
    ~S3Response();
}

public class AmazonS3Client : AmazonS3, IDisposable
{
    public void Dispose();
    ~AmazonS3Client();
}
Run Code Online (Sandbox Code Playgroud)

它们都明确地实现了IDisposable(这告诉我我应该自己处理它们),但它们还指定了一个析构函数方法,这(以及前面提到的示例)让我觉得我是否错过了一些自动的东西?

难道是析构函数 Dispose 在幕后调用?执行这种魔术行为肯定是不好的形式。

有更多 Amazon S3 服务经验的人可以提供一些见解吗?

Sla*_*des 3

首先,当对象被标记为符合销毁条件时,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
Run Code Online (Sandbox Code Playgroud)

然而,一般来说,某些对象的创建(和销毁)成本很高,并且更适合在较长时间内针对多个请求重复使用。在这种情况下(可能对于 S3Client),您将在更长的时间内保留并重复使用对 S3Client 的相同引用,然后仅使用一个请求。请记住,每次实例化 S3Client 时,它可能都会向 Amazon 进行身份验证,这既耗时又昂贵。

假设您有一个使用 S3Client 的网站。您可能希望在整个 Web 请求甚至多个 Web 请求中重复使用同一个 S3Client。您可以通过单例模式甚至像 Unity 这样的依赖注入库来实现这一点,您可以在其中定义一个对象生命周期管理器。

  • 请注意:当您创建客户端时,客户端不会向 Amazon 进行身份验证 - 当您实际在客户端上调用任何内容时,将使用提供的凭据对服务请求进行签名。 (2认同)