È possibile utilizzarlo nel seguente caso: immagina di avere un'applicazione per l'invio di e-mail batch. Scrivi un messaggio (messaggi diversi \ allegati per ogni destinatario, quindi non puoi combinarlo in un singolo messaggio), seleziona ad esempio 20 destinatari e premi il tasto "Invia tutto". Per l'invio si utilizza SendAsync e diverse istanze SmtpClient dal "pool" (poiché SmtpClient non consente di chiamare SendAsync due volte su un'istanza prima che la chiamata precedente non sia completata).
si dispone di un'unica SmtpClientSendCompleted gestore per tutti i SendAsync chiamate in cui si dovrebbe eseguire la registrazione avanzata: risultato l'invio, nomi (indirizzi o anche allegati) dei destinatari dei messaggi non riusciti, ma AsyncCompletedEventArgs di log può fornire queste informazioni solo con l'aiuto di UserState. Quindi il modello di base per questo scopo è utilizzare l'oggetto stato utente personalizzato. Quindi vedere l'esempio semplificato:
interfaccia che contiene i campi di cui avrete bisogno nel gestore:
public interface IEmailMessageInfo{
string RecipientName {get;set;}
}
Async classe Stato:
/// <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;
}
}
Ecco il codice per l'invio di e-mail:
SmtpClient smtpClient = GetSmtpClient(smtpServerAddress);
smtpClient.SendCompleted += SmtpClientSendCompleted;
smtpClient.SendAsync(
GetMailMessage()
new SendAsyncState(new EmailMessageInfo{RecipientName = "Blah-blah"})
);
E nell'esempio di codice del gestore:
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
.....
}
Per favore, fatemi sapere se avete bisogno di maggiori dettagli.
fonte
2012-02-09 08:59:00
Ho descritto di seguito un caso semplificato che ho utilizzato in uno dei miei progetti precedenti. –