Текущий поток вашего кода такой:
- Начните отправку электронной почты.
- Проверьте, успешно ли завершено, решите, что нет, и верните ошибку.
- Электронная почта завершает отправку.
Вы ожидаете фактический метод SendMailAsync(..)
, и это здорово, но ничего не ждет SendMessageAsync(...)
, поэтому он немедленно возвращает незавершенную задачу вызывающей стороне. Поскольку между началом отправки электронного письма и проверкой выполнения задачи недостаточно времени, статус будет ложным.
Вам нужно использовать async до самого конца. Измените определение метода на асинхронное:
public async Task<ViewResult> CheckOut(Order order)
Заменить этот код:
if (GetIsCompleted())
{
Cart.Clear();
return View("Completed");
}
с этим:
try
{
await Email.SendMessageAsync();
Cart.Clear();
return View("Completed");
}
catch (Exception e)
{
// handle exception
}
Стоит отметить, что вы когда-либо получите исключение только в случае сбоя вызова new MailMessage(...)
, поскольку ваш блок try / catch в SendMessageAsync
поглощает все другие исключения.