我有一个场景,一个 MSMQ 排队系统...记录及时排队...一个 WCF 侦听器侦听队列,一旦记录排队就开始处理记录...做一些处理和之后发送电子邮件(有 10 个队列和 10 个侦听器,其中 3 个侦听器负责发送电子邮件)。我面临的问题是电子邮件发送部分,其中较大的数据排队,然后对于某些记录,我收到以下错误
Service not available, closing transmission channel. The server response was: 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel
发送电子邮件的类是
public class A
{
//Method is static as it is a common method used by other processes running in parallel
public static void SendMail()
{
MailMessage mail = new MailMessage();
SmtpClient client = new SmtpClient();
///Email information goes here
client.Send(mail);
}
}
我想即使我的方法是静态的,每次都会实例化 smtp 对象,这会导致问题。即使我增加并发连接也不能解决问题。我有几个解决方法,但需要对此进行更多说明。
- 限制编号。并发连接数假设为 100。所以即使我有 1000 条记录排队并且侦听器开始并行处理它们,smtp 进程一次不会使用超过 100 个连接,等待它完成然后占用下一个 100等等。但我不知道该怎么做。
- 使用并行 foreach 循环或 SmtpClient.SendAsync 方法,但这里我对这些方法的熟练程度也不高,所以我有点害怕(我需要确保没有重大的性能影响)。所以只需要一个稳定和更好的方法来解决这个问题。