Посмотрите на этот пример:
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:
Вы всегда должны использовать 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>Однако он продолжает:
< blockquote>... В результате нет способа определить, когда приложение будет завершено с использованием объекта SmtpClient, и его следует очистить.
blockquote>Итак, предполагая, что вы распоряжаетесь ваш клиент, когда он завершен, в порядке.
Обсуждается ряд связанных с SMTP тем, связанных ниже, поскольку я недавно обнаружил, что задаю один и тот же вопрос
Еще от Stackoverflow:
Каковы наилучшие методы использования SmtpClient, SendAsync и Dispose в .NET 4.0
Как удалить объекты с асинхронными методами?
Связанное чтение:
Реализация Finalize и Dispose для очистки управляемых ресурсов
Прежде всего, очень хорошая практика использовать любой объект в случае необходимости до тех пор, пока вам не понадобится его утилита во всем приложении.
Во-вторых, вы должны создавать объект SmtpClient каждый раз, когда вам это нужно, и правильно распоряжаться им, для чего используйте теги использования, как описано выше, Glitch100.
using (var smtpClient = new SmtpClient())
{
smtpClient.SendMail(message);
}
Начиная с .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, и его следует очистить.
blockquote>