Я немного озадачен тем, как управлять SmtpClient теперь, когда он одноразовый, особенно если я звоню с помощью SendAsync. По-видимому, мне не следует вызывать Dispose до завершения SendAsync. Но должен ли я когда-нибудь называть это (например, используя "использование"). Сценарий представляет собой службу WCF, которая периодически рассылает электронную почту при совершении звонков. Большая часть вычислений выполняется быстро, но отправка электронной почты может занять секунду или около того, поэтому предпочтительнее использовать Async.
Следует ли мне создавать новый SmtpClient каждый раз при отправке почты? Должен ли я создать его для всего WCF? Помогите!
Обновление. Если это имеет значение, каждое электронное письмо всегда настраивается под пользователя. WCF размещен в Azure, а Gmail используется в качестве почтовой программы.
источник
Ответы:
Примечание. .NET 4.5 SmtpClient реализует
async awaitable
методSendMailAsync
. Для более ранних версий используйте,SendAsync
как описано ниже.Вы всегда должны утилизировать
IDisposable
экземпляры при первой возможности. В случае асинхронных вызовов это выполняется обратным вызовом после отправки сообщения.Это немного раздражает, потому что
SendAsync
не принимает обратный вызов.источник
await
был доступен. Это традиционный обратный вызов с использованием обработчиков событий.await
следует использовать при использовании более новой версииSendMailAsync
.null
в качестве второго параметраSendAsync(...)
?Исходный вопрос был задан для .NET 4, но если он помогает, начиная с .NET 4.5, SmtpClient реализует метод async awaitable
SendMailAsync
.В результате асинхронная отправка электронной почты выглядит следующим образом:
Лучше избегать использования метода SendAsync.
источник
MailMessage
также должен быть удален.В общем, объекты IDisposable следует удалять как можно скорее; реализация IDisposable на объекте предназначена для сообщения того факта, что рассматриваемый класс содержит дорогие ресурсы, которые должны быть детерминированно освобождены. Однако, если создание этих ресурсов является дорогостоящим и вам нужно создать множество этих объектов, может быть лучше (с точки зрения производительности) сохранить один экземпляр в памяти и повторно использовать его. Есть только один способ узнать, имеет ли это значение: профилировать это!
Re: утилизация и Async:
using
очевидно, вы не можете использовать . Вместо этого вы обычно удаляете объект в событии SendCompleted:источник
Хорошо, старый вопрос я знаю. Но я сам наткнулся на это, когда мне нужно было реализовать что-то подобное. Я просто хотел поделиться кодом.
Я перебираю несколько SmtpClients, чтобы отправлять несколько писем асинхронно. Мое решение похоже на TheCodeKing, но вместо этого я удаляю объект обратного вызова. Я также передаю MailMessage как userToken, чтобы получить его в событии SendCompleted, чтобы я мог также вызвать dispose для этого. Как это:
источник
4.3.2 The maximum number of concurrent connections has exceeded a limit, closing trasmission channel
. Вместо этого попробуйте использовать только один экземплярSmtpClient
Вы можете понять, почему особенно важно избавиться от SmtpClient, из следующего комментария:
В моем сценарии отправки нескольких писем с помощью Gmail без удаления клиента я обычно получал:
источник