Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该创建并重用AmazonSimpleEmailServiceClient作为一个单例吗?_C#_.net_Amazon Web Services_Aws Sdk - Fatal编程技术网

C# 我应该创建并重用AmazonSimpleEmailServiceClient作为一个单例吗?

C# 我应该创建并重用AmazonSimpleEmailServiceClient作为一个单例吗?,c#,.net,amazon-web-services,aws-sdk,C#,.net,Amazon Web Services,Aws Sdk,使用AmazonSimpleEmailServiceClient发送电子邮件的演示使用using语句初始化: using (var client = new AmazonSimpleEmailServiceClient(RegionEndpoint.USWest2)) { //... } 举个例子,我知道这没问题,但是,在我的生产应用程序中,我是否应该初始化AmazonSimpleEmailServiceClient一次,然后重新使用它 // MailSender is registe

使用
AmazonSimpleEmailServiceClient
发送电子邮件的演示使用
using
语句初始化:

using (var client = new AmazonSimpleEmailServiceClient(RegionEndpoint.USWest2))
{
    //...
}
举个例子,我知道这没问题,但是,在我的生产应用程序中,我是否应该初始化
AmazonSimpleEmailServiceClient
一次,然后重新使用它

// MailSender is registered with DI as Singleton
public class MailSender
{
    private AmazonSimpleEmailServiceClient _client;

    public MailSender()
    {
        _client = new AmazonSimpleEmailServiceClient(RegionEndpoint.USWest2);
    }

    public void SendEmail()
    {
        // ...
        _client.SendEmail(request);
    }
}

我的制作应用程序正在发送大量电子邮件。我不确定
AmazonSimpleEmailServiceClient
对象的行为如何,但创建一个实例似乎比每次发送电子邮件时更新它更有效。

是的,您应该始终实例化要多次使用的类。在非垃圾收集器语言(如C++)中,到处实例化类而不处理它们可能是一个问题。

重用类时,您关心的不仅是性能,还包括并发性

话虽如此,快速查看一下就会发现该类调用其基类AmazonWebServiceClient的
Dispose
方法:

#region Dispose

protected override void Dispose(bool disposing)
{
    base.Dispose(disposing);
}
#endregion
基类不重写Dispose方法,而是依赖于自己的基类AbstractWebServiceClient:

/// <summary>
/// Implements the Dispose pattern for the AmazonWebServiceClient
/// </summary>
/// <param name="disposing">Whether this object is being disposed via a call to Dispose
/// or garbage collected.</param>
protected virtual void Dispose(bool disposing)
{
    if (!this.disposed)
    {
        if (disposing && logger != null)
        {
            logger.Flush();
            logger = null;
        }
        this.disposed = true;
    }
}
//
///实现AmazonWebServiceClient的Dispose模式
/// 
///是否通过调用Dispose来释放此对象
///或垃圾收集。
受保护的虚拟void Dispose(bool disposing)
{
如果(!this.disposed)
{
if(处理和记录程序!=null)
{
logger.Flush();
logger=null;
}
这是真的;
}
}
请注意,
Dispose
方法正在清理记录器的内部实例

因此,在性能方面,肯定会有所收获。然而,就并发性而言,在代码注释中没有提到类是线程安全的

但是,它们的生命周期中确实提到了线程安全和类重用:

用于.NET的AWS SDK最著名的方面是各种服务 可用于与AWS交互的客户端。客户端对象是 线程安全、一次性和可重复使用。(客户端对象是 便宜,因此通过构造 多个实例,但创建和重用一个 客户。)


希望这能有所帮助。

这是一个IDisposable<代码>IDisposable促使开发人员处理实例。处理单例可能会导致应用程序部分崩溃。为什么你需要它是一个单身汉?我的生产应用程序可能重复发送大量电子邮件。我不确定
AmazonSimpleEmailServiceClient
对象的行为如何,但创建一个实例似乎比每次发送电子邮件时更新它更有效。不过我建议不要使用单实例。总有办法重新设计你的逻辑,这样你就可以成批发送电子邮件。例如:
using(var-emailer){foreach(var-email){emailer.Send(email)}}