Estou um pouco perplexo sobre como gerenciar SmtpClient agora que ele é descartável, especialmente se eu fizer chamadas usando SendAsync. Presumivelmente, não devo chamar Dispose até que SendAsync seja concluído. Mas devo chamá-lo (por exemplo, usando "usando"). O cenário é um serviço WCF que envia e-mails periodicamente quando as chamadas são feitas. A maior parte do cálculo é rápida, mas o envio de e-mail pode levar cerca de um segundo, portanto, o Async seria preferível.
Devo criar um novo SmtpClient cada vez que enviar um e-mail? Devo criar um para todo o WCF? Socorro!
Atualizar Caso faça diferença, cada e-mail é sempre customizado para o usuário. O WCF é hospedado no Azure e o Gmail é usado como remetente.
c#
.net-4.0
smtpclient
tofutim
fonte
fonte
Respostas:
Nota: .NET 4.5 SmtpClient implementa o
async awaitable
métodoSendMailAsync
. Para versões anteriores, useSendAsync
conforme descrito abaixo.Você deve sempre descartar as
IDisposable
instâncias o mais rápido possível. No caso de chamadas assíncronas, isso ocorre no retorno de chamada após o envio da mensagem.É um pouco chato
SendAsync
porque não aceita uma chamada de retorno.fonte
await
estar disponível. Este é um retorno de chamada tradicional usando manipuladores de eventos.await
deve ser usado se estiver usando o mais recenteSendMailAsync
.null
como o segundo parâmetro paraSendAsync(...)
?A pergunta original foi feita para o .NET 4, mas se ajudar a partir do .NET 4.5, SmtpClient implementa o método assíncrono aguardável
SendMailAsync
.Como resultado, o envio de e-mail de forma assíncrona é o seguinte:
É melhor evitar o uso do método SendAsync.
fonte
MailMessage
também deve ser descartado.Em geral, os objetos IDisposable devem ser descartados o mais rápido possível; implementar IDisposable em um objeto tem como objetivo comunicar o fato de que a classe em questão contém recursos caros que deveriam ser liberados de forma determinística. No entanto, se criar esses recursos for caro e você precisar construir muitos desses objetos, pode ser melhor (em termos de desempenho) manter uma instância na memória e reutilizá-la. Só há uma maneira de saber se isso faz alguma diferença: crie um perfil!
Re: descarte e assíncrono: você não pode usar
using
obviamente. Em vez disso, você normalmente descarta o objeto no evento SendCompleted:fonte
Ok, velha pergunta eu sei. Mas me deparei com isso quando precisava implementar algo semelhante. Eu só queria compartilhar um código.
Estou iterando em vários SmtpClients para enviar vários emails de forma assíncrona. Minha solução é semelhante a TheCodeKing, mas estou descartando o objeto de retorno de chamada. Também estou passando MailMessage como userToken para obtê-lo no evento SendCompleted, para que eu possa chamar dispose nisso também. Como isso:
fonte
4.3.2 The maximum number of concurrent connections has exceeded a limit, closing trasmission channel
. Em vez disso, tente usar apenas uma instância deSmtpClient
Você pode ver por que é particularmente importante descartar SmtpClient com o seguinte comentário:
No meu cenário de envio de vários e-mails usando o Gmail sem descartar o cliente, eu costumava obter:
fonte