Вопрос

Я пишу код, который отправляет 2 кода в 2 разных электронных письма (чтобы проверить, что владелец обоих электронных писем - один и тот же человек). И я получил ошибку:

System.invalidoperationException: асинхронный вызов уже проходит. Он должен быть завершен или отменен, прежде чем вы сможете вызвать этот метод.

Что ж, я могу просто избежать этой ошибки, отправляя вторую электронную почту после того, как отправка первого завершилась, но вопрос в том, что, если многие пользователи одновременно запросите электронное письмо с отправкой (забытый пароль, изменение электронной почты, регистрация, ...) это вызывает проблему? Или я получу эту ошибку только тогда, когда они будут выполнены многократно на одной странице?

Заранее спасибо,
Ашкан

Это было полезно?

Решение

Цель метода SendAsync - не блокировать вызову; Тем не менее, вы должны ждать, пока метод SendAsync завершит, прежде чем вы сможете отправить новое электронное письмо в тот же экземпляр SMTPClient. Другими словами, создайте 2 экземпляра, по одному на каждое электронное письмо и отправьте их оба асинхронно, если хотите.

От MSDN:

После вызова SendAsync вы должны ждать завершения передачи электронной почты, прежде чем попытаться отправить еще одно сообщение электронной почты с помощью Send или SendAsync.

Другие советы

Как отметил Икарус, вы должны ждать SendAsync Закончить, прежде чем вызовать его в том же экземпляре. В дополнение к этому можно было ThreadPool Голод, но ваш пробег будет варьироваться в зависимости от вашей реализации. Внутри, SendMailAsync использует ThreadPool поток, чтобы выполнить задачу. Я не был бы обеспокоен, если бы это просто электронное письмо здесь и там.

Никакие отдельные случаи не будут проблемой. Если многие пользователи отправляют запросы одновременно, каждый из них будет разными экземплярами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top