2012-02-08 7 views
12

Estaba usando el método SMTPClient.Send(mail) para enviar correos electrónicos, pero luego vi, si el ID de correo electrónico no está presente (no existe), mi aplicación espera hasta que reciba la excepción y luego permite al usuario realizar otras tareas.¿Qué beneficios puedo tomar del objeto userToken de SmtpClient.SendAsync?

Así que pensé en usar el método SMTPClient.SendAsync.

Mi duda !! ¿Dónde se puede usar este objeto UserToken que se pasa como el parámetro del método? Busqué muchas cosas en línea, pero no encontré un buen ejemplo. Incluso en MSDN que lo utilizan como esto

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

Pero entonces ¿qué puede ser realmente utilizados para?

Gracias de antemano.

+0

Describí a continuación un caso simplificado que utilicé en uno de mis proyectos anteriores. –

Respuesta

20

Puede usarlo en el siguiente caso: imagínese que tiene una aplicación para el envío de correo electrónico por lotes. Usted redacta el mensaje (diferentes mensajes \ archivos adjuntos para cada destinatario, por lo que no puede combinarlo en un solo mensaje), seleccione por ejemplo 20 destinatarios y presione el botón "Enviar todo". Para enviarlo, utilice SendAsync y varias instancias de SmtpClient desde el "grupo" (ya que SmtpClient no permite llamar a SendAsync dos veces en una instancia antes de que no se complete la llamada anterior).

usted tiene un solo SmtpClientSendCompleted controlador para todos los SendAsync llamadas en las que debe realizar el registro avanzado: resultado de los nombres de origen, (direcciones o incluso archivos adjuntos) de los destinatarios de los mensajes fallidos, pero AsyncCompletedEventArgs log puede proporcionar esta información solo con la ayuda de UserState. Entonces, el patrón básico para este propósito es usar un objeto de estado de usuario personalizado. Así que ver el ejemplo simplificado:

interfaz que contiene campos que se necesitan en el controlador:

public interface IEmailMessageInfo{ 
    string RecipientName {get;set;} 
} 

clase de estado asíncrono:

/// <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; 
    } 
} 

Aquí el código para el envío de correo electrónico:

SmtpClient smtpClient = GetSmtpClient(smtpServerAddress); 
smtpClient.SendCompleted += SmtpClientSendCompleted; 
smtpClient.SendAsync(
    GetMailMessage() 
    new SendAsyncState(new EmailMessageInfo{RecipientName = "Blah-blah"}) 
); 

Y el código de controlador ejemplo:

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

Háganme saber si necesita más información.

1

Si está utilizando async(), también necesita tener el controlador de eventos.

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

Esto está bien para enviar correos electrónicos utilizando el método Async(). Espero que esto sea útil.

Cuestiones relacionadas