Je suis un peu perplexe sur la façon de gérer SmtpClient maintenant qu'il est jetable, surtout si je passe des appels en utilisant SendAsync. Je ne devrais probablement pas appeler Dispose avant la fin de SendAsync. Mais devrais-je jamais l'appeler (par exemple, en utilisant "using"). Le scénario est un service WCF qui envoie régulièrement des e-mails lorsque des appels sont effectués. La plupart des calculs sont rapides, mais l'envoi d'e-mails peut prendre une seconde environ, donc Async serait préférable.
Dois-je créer un nouveau SmtpClient à chaque fois que j'envoie du courrier? Dois-je en créer un pour l'ensemble de la WCF? Aidez-moi!
Mise à jour Au cas où cela ferait une différence, chaque e-mail est toujours personnalisé pour l'utilisateur. Le WCF est hébergé sur Azure et Gmail est utilisé comme messagerie.
la source
Réponses:
Remarque: .NET 4.5 SmtpClient implémente la
async awaitable
méthodeSendMailAsync
. Pour les versions inférieures, utilisezSendAsync
comme décrit ci-dessous.Vous devez toujours supprimer les
IDisposable
instances le plus tôt possible. Dans le cas des appels asynchrones, il s'agit du rappel après l'envoi du message.C'est un peu ennuyeux que
SendAsync
n'accepte pas de rappel.la source
await
était disponible. Il s'agit d'un rappel traditionnel utilisant des gestionnaires d'événements.await
doit être utilisé si vous utilisez le plus récentSendMailAsync
.null
comme deuxième paramètre àSendAsync(...)
?La question d'origine a été posée pour .NET 4, mais si cela aide à partir de .NET 4.5, SmtpClient implémente la méthode attendable asynchrone
SendMailAsync
.Par conséquent, pour envoyer des e-mails de manière asynchrone, procédez comme suit:
Il vaut mieux éviter d'utiliser la méthode SendAsync.
la source
MailMessage
doit également être éliminé.En général, les objets IDisposables doivent être éliminés dès que possible; l'implémentation de IDisposable sur un objet est destinée à communiquer le fait que la classe en question contient des ressources coûteuses qui devraient être libérées de manière déterministe. Cependant, si la création de ces ressources coûte cher et que vous devez construire beaucoup de ces objets, il peut être préférable (en termes de performances) de conserver une instance en mémoire et de la réutiliser. Il n'y a qu'une seule façon de savoir si cela fait une différence: profiler!
Re: disposer et Async: vous ne pouvez pas utiliser
using
évidemment. Au lieu de cela, vous supprimez généralement l'objet dans l'événement SendCompleted:la source
Ok, vieille question que je connais. Mais je suis tombé sur cela moi-même lorsque j'avais besoin de mettre en œuvre quelque chose de similaire. Je voulais juste partager du code.
J'itère plusieurs SmtpClients pour envoyer plusieurs e-mails de manière asynchrone. Ma solution est similaire à TheCodeKing, mais je supprime l'objet de rappel à la place. Je passe également MailMessage en tant que userToken pour l'obtenir dans l'événement SendCompleted afin que je puisse également appeler Dispose sur cela. Comme ça:
la source
4.3.2 The maximum number of concurrent connections has exceeded a limit, closing trasmission channel
. Essayez plutôt de n'utiliser qu'une seule instance deSmtpClient
Vous pouvez voir pourquoi il est particulièrement important de se débarrasser de SmtpClient par le commentaire suivant:
Dans mon scénario d'envoi de plusieurs e-mails à l'aide de Gmail sans supprimer le client, j'avais l'habitude d'obtenir:
la source