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.
Describí a continuación un caso simplificado que utilicé en uno de mis proyectos anteriores. –