Estoy un poco perplejo sobre cómo administrar SmtpClient ahora que es desechable, especialmente si hago llamadas usando SendAsync. Es de suponer que no debería llamar a Dispose hasta que se complete SendAsync. Pero, ¿debería llamarlo alguna vez (por ejemplo, usando "using"). El escenario es un servicio WCF que envía correos electrónicos periódicamente cuando se realizan llamadas. La mayor parte del cálculo es rápido, pero el envío del correo electrónico puede tardar aproximadamente un segundo, por lo que sería preferible Async.
¿Debo crear un nuevo SmtpClient cada vez que envío correo? ¿Debo crear uno para todo el WCF? ¡Ayuda!
Actualización En caso de que marque la diferencia, cada correo electrónico siempre está personalizado para el usuario. WCF está alojado en Azure y Gmail se usa como correo.
fuente
Respuestas:
Nota: .NET 4.5 SmtpClient implementa el
async awaitable
métodoSendMailAsync
. Para versiones inferiores, utiliceSendAsync
como se describe a continuación.Siempre debe deshacerse de las
IDisposable
instancias lo antes posible. En el caso de las llamadas asíncronas, esto está en la devolución de llamada después de que se envía el mensaje.Es un poco molesto
SendAsync
que no acepte una devolución de llamada.fuente
await
estuviera disponible. Esta es una devolución de llamada tradicional que utiliza controladores de eventos.await
debe usarse si se usa el más nuevoSendMailAsync
.null
como segundo parámetroSendAsync(...)
?La pregunta original se hizo para .NET 4, pero si ayuda a partir de .NET 4.5 SmtpClient implementa un método asincrónico en espera
SendMailAsync
.Como resultado, enviar correo electrónico de forma asincrónica es el siguiente:
Es mejor evitar el uso del método SendAsync.
fuente
MailMessage
también debe desecharse.En general, los objetos desechables deben desecharse lo antes posible; La implementación de IDisposable en un objeto pretende comunicar el hecho de que la clase en cuestión contiene recursos costosos que deberían liberarse de forma determinista. Sin embargo, si la creación de esos recursos es costosa y necesita construir muchos de estos objetos, puede ser mejor (en términos de rendimiento) mantener una instancia en la memoria y reutilizarla. Solo hay una forma de saber si eso hace alguna diferencia: perfilarlo.
Re: desechar y Async:
using
obviamente no se puede usar . En su lugar, normalmente desecha el objeto en el evento SendCompleted:fuente
Ok, vieja pregunta, lo sé. Pero me encontré con esto yo mismo cuando necesitaba implementar algo similar. Solo quería compartir un código.
Estoy iterando sobre varios SmtpClients para enviar varios correos de forma asincrónica. Mi solución es similar a TheCodeKing, pero estoy desechando el objeto de devolución de llamada. También estoy pasando MailMessage como userToken para obtenerlo en el evento SendCompleted para que pueda llamar a dispose también. Me gusta esto:
fuente
4.3.2 The maximum number of concurrent connections has exceeded a limit, closing trasmission channel
. En su lugar, intente usar solo una instancia deSmtpClient
Puede ver por qué es particularmente importante deshacerse de SmtpClient mediante el siguiente comentario:
En mi escenario, enviando varios correos electrónicos usando Gmail sin deshacerme del cliente, solía obtener:
fuente