Какие преимущества я могу получить от SmtpClient.Объект userToken SendAsync?
Я был с помощью SMTPClient.Send(mail)
метод отправки электронной почты, но затем я увидел, если идентификатор электронной почты отсутствует (не существует), мое приложение ждет, пока оно не получит исключение, а затем позволяет пользователю выполнять дальнейшие задачи.
поэтому я подумал об использовании SMTPClient.Метод SendAsync.
мои сомнения!! Где можно использовать этот объект userToken, который передается в качестве параметра методу? Я искал много вещей в интернете, но не нашел хорошего примера. Даже в MSDN они используют его так
string userState = "test message1";
client.SendAsync(message, userState);
но тогда для чего он может быть действительно использован?
спасибо заранее.
2 ответов
вы можете использовать его в следующем случае: представьте, что у вас есть приложение для пакетной отправки почты. Вы составляете сообщение (разные сообщения\вложения для каждого получателя, поэтому вы не можете объединить его в одно сообщение), выберите, например, 20 получателей и нажмите кнопку "Отправить все". Для отправки вы используете SendAsync и несколько экземпляров SmtpClient из "пула"(поскольку SmtpClient не позволяет дважды вызывать SendAsync на одном экземпляре до завершения предыдущего вызова).
вы есть один SmtpClientSendCompleted обработчик для всех SendAsync вызовы, в которых вы должны выполнить расширенный журнал: результат журнала отправки, имена (адреса или даже вложения) получателей неудачных сообщений, но AsyncCompletedEventArgs может предоставить эту информацию только с помощью UserState. Поэтому основным шаблоном для этой цели является использование пользовательского объекта состояния пользователя. Так что смотрите упрощенный пример:
интерфейс, который содержит поля, которые вам понадобятся в обработчике:
public interface IEmailMessageInfo{
string RecipientName {get;set;}
}
асинхронный класс:
/// <summary>
/// User defined async state for SendEmailAsync method
/// </summary>
public class SendAsyncState {
/// <summary>
/// Contains all info that you need while handling message result
/// </summary>
public IEmailMessageInfo EmailMessageInfo { get; private set; }
public SendAsyncState(IEmailMessageInfo emailMessageInfo) {
EmailMessageInfo = emailMessageInfo;
}
}
вот код для отправки email:
SmtpClient smtpClient = GetSmtpClient(smtpServerAddress);
smtpClient.SendCompleted += SmtpClientSendCompleted;
smtpClient.SendAsync(
GetMailMessage()
new SendAsyncState(new EmailMessageInfo{RecipientName = "Blah-blah"})
);
и пример кода обработчика:
private void SmtpClientSendCompleted(object sender, AsyncCompletedEventArgs e){
var smtpClient = (SmtpClient) sender;
var userAsyncState = (SendAsyncState) e.UserState;
smtpClient.SendCompleted -= SmtpClientSendCompleted;
if(e.Error != null) {
tracer.ErrorEx(
e.Error,
string.Format("Message sending for \"{0}\" failed.",userAsyncState.EmailMessageInfo.RecipientName)
);
}
// Cleaning up resources
.....
}
пожалуйста, дайте мне знать, если вам нужно больше деталей.
Если вы используете async (), вам также нужен обработчик событий.
static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
//to be implemented
}
это нормально для отправки электронной почты с помощью метода Async (). Надеюсь, это поможет.