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)}}