2015-06-02 2 views
3

Я создаю службу Windows, которая отправляет партии писем каждые 5 минут.SmtpClient - Какова правильная продолжительность жизни?

Я хочу отправлять партии по 10-100 писем каждые 5 минут. Это крайний край. Пакеты отправляются каждые 5 минут и обычно состоят из 10 писем.

Я использую SmtpClient из System.Net.Mail пространства имен.

Что такое правильное время жизни объекта SmtpClient? Должен ли я создать его каждый раз, когда отправляется пакет? Или мне нужно создать его на старте службы и никогда не удалять его?

ответ

5

Вы должны всегда использовать using

using (var smtpClient = new SmtpClient()) 
{ 
    smtpClient.SendMail(message); 
} 

Вы всегда должны распоряжаться всем, что реализует IDisposable, как только вы закончите с it.The класса SmtpClient в .NET 4.0 реализует IDisposable, поэтому обязательно используйте его!

Цитирую MSDN:

Класс SmtpClient не имеет какого-либо метода Finalize, поэтому приложение должно вызов Dispose явно освободить ресурсы.

Если вы обнаружите, что занимаетесь асинхронными задачами, вы можете создать новый экземпляр для каждого письма, чтобы предотвратить блокирование самостоятельно. Вы можете использовать следующее.

var smtpClient = new SmtpClient(); 
smtpClient.SendCompleted += (s, e) => { 
          client.Dispose(); 
          message.Dispose(); 
         }; 
client.SendAsync(message, null); 

В Запроса - лучший вариант для Bulk Отправить сообщения электронной почты

Как было отмечено выше, вы можете использовать один и тот же клиент. Если держать все это в том же потоке, я рекомендую вам использовать только один клиент

MSDN государства:

Класс SmtpClient бассейны реализации SMTP соединения, так что может избежать накладных расходов на повторное установление соединения для каждого сообщения одному и тому же серверу. Приложение может повторно использовать тот же объект SmtpClient, чтобы отправлять много разных писем на тот же сервер SMTP и на множество разных SMTP-серверов.

Однако он идет дальше сказать:

... В результате, нет никакого способа определить, когда приложение закончил использование объекта SmtpClient, и он должен быть очищен.

Таким образом, предполагая, что вы распоряжаетесь своим Клиентом по завершении, это нормально.


Существует обсуждение ряда связанных SMTP тем, связанных ниже, как я недавно обнаружил, что задают тот же вопрос

Больше от Stackoverflow:

What are best practices for using SmtpClient, SendAsync and Dispose under .NET 4.0

How to dispose objects having asynchronous methods called?

Rela Ted Чтение:

MSDN SmtpClient

Implementing Finalize and Dispose to clean up managed resources

+0

Я не согласен с частью «как только у вас есть шанс». и что это значит «как только» в моей заявке? Также создание SmtpClient требует времени, так как ему необходимо установить безопасное соединение. – Hooch

+0

Это оставалось от моих сумасшедших прав. Нет ничего, что остановило бы вас на использовании одного клиента, особенно если вы полностью контролируете поток сообщений электронной почты, однако вы можете обнаружить, что вы получаете исключения, когда он не может отправлять электронные письма, потому что он все еще ждет ответа. Это не слишком дорого для создания, если вы ограничиваете сумму. Если вы решили использовать один клиент, возможно, используя BlockingCollection, и семафор может достичь этого – JonE

+1

Я думаю, что я создам на клиенте за партию. Он выглядит более логичным, по одному на электронную почту и один раз за приложение. – Hooch

0

Прежде всего, это очень хорошая практика, чтобы использовать любой предмет, по мере необходимости до тех пор пока и если вы не нуждаетесь в его полезности по всему приложению.

Во-вторых, вы должны создавать объект SmtpClient каждый раз, когда вам это нужно, и правильно распоряжаться им, для чего используйте теги использования, как описано выше, Glitch100.

using (var smtpClient = new SmtpClient()) 
{ 
    smtpClient.SendMail(message); 
} 
3

Начиная с .NET 4.0, соединения SmtpClient объединяются, поэтому вы можете продолжать его на некоторое время. Вероятно, лучше всего избавиться от него после того, как вы закончили отправку партии.

Из MSDN: https://msdn.microsoft.com/en/us/library/system.net.mail.smtpclient(v=VS.100).aspx

Соединения бассейны реализации класса SMTP SmtpClient так, что он может избежать накладных расходов на повторное установление соединения для каждого сообщения на том же сервере. Приложение может повторно использовать один и тот же объект SmtpClient для отправки множества разных писем на один и тот же SMTP-сервер и на множество разных SMTP-серверов. В результате невозможно определить, когда приложение будет завершено с использованием объекта SmtpClient, и его следует очистить.

Смежные вопросы