Разумно использовать smtp.sendasync в asp.net
Вопрос
Я пишу код, который отправляет 2 кода в 2 разных электронных письма (чтобы проверить, что владелец обоих электронных писем - один и тот же человек). И я получил ошибку:
System.invalidoperationException: асинхронный вызов уже проходит. Он должен быть завершен или отменен, прежде чем вы сможете вызвать этот метод.
Что ж, я могу просто избежать этой ошибки, отправляя вторую электронную почту после того, как отправка первого завершилась, но вопрос в том, что, если многие пользователи одновременно запросите электронное письмо с отправкой (забытый пароль, изменение электронной почты, регистрация, ...) это вызывает проблему? Или я получу эту ошибку только тогда, когда они будут выполнены многократно на одной странице?
Заранее спасибо,
Ашкан
Решение
Цель метода SendAsync - не блокировать вызову; Тем не менее, вы должны ждать, пока метод SendAsync завершит, прежде чем вы сможете отправить новое электронное письмо в тот же экземпляр SMTPClient. Другими словами, создайте 2 экземпляра, по одному на каждое электронное письмо и отправьте их оба асинхронно, если хотите.
После вызова SendAsync вы должны ждать завершения передачи электронной почты, прежде чем попытаться отправить еще одно сообщение электронной почты с помощью Send или SendAsync.
Другие советы
Как отметил Икарус, вы должны ждать SendAsync
Закончить, прежде чем вызовать его в том же экземпляре. В дополнение к этому можно было ThreadPool
Голод, но ваш пробег будет варьироваться в зависимости от вашей реализации. Внутри, SendMailAsync
использует ThreadPool
поток, чтобы выполнить задачу. Я не был бы обеспокоен, если бы это просто электронное письмо здесь и там.
Никакие отдельные случаи не будут проблемой. Если многие пользователи отправляют запросы одновременно, каждый из них будет разными экземплярами.