2012-02-08 8 views
12

Stavo usando il metodo SMTPClient.Send(mail) per inviare e-mail, ma poi ho visto, se l'ID e-mail non è presente (non esiste), la mia applicazione aspetta finché non riceve l'eccezione e quindi consente all'utente di eseguire ulteriori attività.Quali vantaggi posso trarre dall'oggetto userToken di SmtpClient.SendAsync?

Quindi ho pensato di utilizzare il metodo SMTPClient.SendAsync.

Il mio dubbio !! Dove può essere usato questo oggetto userToken che viene passato come parametro al metodo? Ho cercato molte cose online ma non ho trovato un buon esempio. Anche in MSDN lo usano come questo

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

Ma allora che cosa può essere davvero utilizzato per?

Grazie in anticipo.

+0

Ho descritto di seguito un caso semplificato che ho utilizzato in uno dei miei progetti precedenti. –

risposta

20

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

1

Se si utilizza async(), è necessario disporre anche del gestore eventi.

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

Questo va bene per inviare e-mail utilizzando il metodo Async(). Spero che questo sia utile.