Domanda

Qual è il modo corretto di smaltire SmtpClient e MailMessage durante l'utilizzo SendAsync?

Ho copiato il mio codice qui sotto.

{
...
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();
}

Smaltimento l'MailMessage dopo la client.SendAsync(...) genera un'eccezione. Ho bisogno di smaltire nel gestore di richiamata.

È stato utile?

Soluzione

Questo è corretto.

Si noti che MailMessage non ridefinisce ToString, in modo che le log semplicemente dire [MailMessage] Send cancelled.
Si potrebbe desiderare di utilizzare la proeprty Subject (o qualche altra proprietà), invece.

Altri suggerimenti

Credo che questo potrebbe aiutare

   client.SendCompleted += (s, e) => { client.Dispose(); message.Dispose(); };
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top