Какие преимущества я могу извлечь из объекта userToken SmtpClient.SendAsync? - PullRequest
14 голосов
/ 08 февраля 2012

Я использовал SMTPClient.Send(mail) метод для отправки электронных писем, но затем я увидел, что если идентификатор электронной почты отсутствует (не существует), мое приложение ждет, пока оно получит исключение, а затем позволяет пользователю выполнять дальнейшие задачи.

Итак, я подумал об использовании метода SMTPClient.SendAsync.

Мои сомнения !!Где можно использовать этот объект userToken, который передается в качестве параметра методу?Я искал много вещей в Интернете, но я не нашел хорошего примера.Даже в MSDN они используют его вот так

string userState = "test message1";
client.SendAsync(message, userState);

Но тогда для чего оно действительно может быть использовано?

Заранее спасибо.

Ответы [ 2 ]

24 голосов
/ 09 февраля 2012

Вы можете использовать его в следующем случае: представьте, что у вас есть приложение для пакетной отправки электронной почты. Вы составляете сообщение (разные сообщения \ вложения для каждого получателя, поэтому вы не можете объединить его в одно сообщение), выбираете, например, 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;
    }
}

Вот код для отправки электронной почты:

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
    .....
}

Пожалуйста, дайте мне знать, если вам нужно больше деталей.

1 голос
/ 11 марта 2013

Если вы используете async (), вам также необходим обработчик события.

   static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        //to be implemented        
    }

Это нормально для отправки электронной почты с использованием метода Async ().Надеюсь, что это полезно.

...