2010-04-19 13 views
2

Quelle est la bonne façon de disposer de SmtpClient et MailMessage tout en utilisant SendAsync?SmtpClient.SendAsync code revue

J'ai copié mon code ci-dessous.

{ 
... 
var client = new SmtpClient {Host = _smtpServer}; 
client.SendCompleted += SendCompletedCallback; 
var userState = mailMessage; 
client.SendAsync(mailMessage, userState); 
... 
} 

private static void SendCompletedCallback(object sender, 
    AsyncCompletedEventArgs e) 
{ 
    // Get the unique identifier for this asynchronous operation. 
    var mailMessage= (MailMessage)e.UserState; 

    if (e.Cancelled) 
    { 
     Log.Info(String.Format("[{0}] Send canceled.", mailMessage)); 
    } 
    if (e.Error != null) 
    { 
     Log.Error(String.Format("[{0}] {1}", mailMessage, e.Error)); 
    } 
    else 
    { 
     Log.Info("Message sent."); 
    } 
    mailMessage.Dispose(); 
} 

le MailMessage après Mise au rebut du client.SendAsync(...) lève une exception. Je dois le disposer dans le gestionnaire de rappel.

Répondre

1

Cela semble correct.

Notez que MailMessage ne remplace pas ToString, donc vos journaux indiqueront simplement [MailMessage] Send cancelled.
Vous pouvez utiliser le proeprty Subject (ou une autre propriété) à la place.

+0

j'induits en erreur à cause de cet exemple de msdn http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx où ils disposent du mailMessage dans la fonction principale et non dans le rappel. –

+0

@Lieven Cardoen, la raison est, l'exemple utiliser une console et attendre l'entrée de l'utilisateur – Fredou

+0

Ok, merci pour le commentaire ToString. –

2

Je pense que cela pourrait aider

client.SendCompleted += (s, e) => { client.Dispose(); message.Dispose(); }; 
+0

Mais en utilisant cette méthode, le gestionnaire d'événements renvoyé par l'expéditeur saura exactement quels objets client et message doivent être éliminés? En cas d'utilisation de plusieurs envois asynchrones à l'intérieur d'une boucle. Je demande parce que dans le premier exemple, il envoie un objet Message via le paramètre userState. – Sawd