Можно ли использовать один экземпляр SmtpClient для каждого приложения для отправки электронной почты в .Net? [Дубликат]

Посмотрите на этот пример:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope,$http) {

    var getJoke = function(){
        return $http.get('http://api.icndb.com/jokes/random').then(function(res){
            return res.data.value;  
        });
    }

    getJoke().then(function(res) {
        console.log(res.joke);
    });
});

Как вы можете видеть, getJoke возвращает разрешенное обещание (оно разрешено при возврате res.data.value). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).

Это plnkr:

http://embed.plnkr.co/XlNR7HpCaIhJxskMJfSg/

4
задан Amna 2 June 2015 в 08:41
поделиться

3 ответа

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

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

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

Чтобы указать MSDN:

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

< / blockquote>

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

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

В запросе - лучший вариант для массовых рассылок электронной почты

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

MSDN States:

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

Однако он продолжает:

< blockquote>

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

Итак, предполагая, что вы распоряжаетесь ваш клиент, когда он завершен, в порядке.


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

Еще от Stackoverflow:

Каковы наилучшие методы использования SmtpClient, SendAsync и Dispose в .NET 4.0

Как удалить объекты с асинхронными методами?

Связанное чтение:

MSDN SmtpClient

Реализация Finalize и Dispose для очистки управляемых ресурсов

6
ответ дан Community 23 August 2018 в 16:48
поделиться

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

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

 using (var smtpClient = new SmtpClient())
 {
     smtpClient.SendMail(message);
 }
0
ответ дан Murtaza Munshi 23 August 2018 в 16:48
поделиться

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

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

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

3
ответ дан rlee 23 August 2018 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: