Невозможно вернуть выполненную успешную задачу в ядре .net - PullRequest
0 голосов
/ 14 мая 2018

Привет, я написал следующий код:

  private bool GetIsCompleted()
  {
        return Email.SendMessageAsync().IsCompletedSuccessfully;
  }
   [HttpPost]
    public  ViewResult CheckOut(Order order)
    {
        if (Cart.Lines.Count() == 0)
        {
            ModelState.AddModelError("","Your Cart is empty!");
        }

        if (ModelState.IsValid)
        {
            order.CartLines = Cart.Lines;
            order.DateTime = DateTime.Now;
            order.TotalPrice = Cart.ComputeTotalValue();
            if (Repository.SaveOrder(order))
            {
                if (User.Identity.Name != null)
                {
                    Email.SetMessageBody(order.OrderID);

                    if (GetIsCompleted())
                    {
                        Cart.Clear();
                        return View("Completed");
                    }
                }
            }

            ViewBag.Error = "An error Occured while sending you an email with the order details.";
            return View(new Order());
        }
        else
        {
            ViewBag.Error = "An error Occured while trying to save your order. Please try again!";
            return View(new Order());
        }             
    }

 public async Task SendMessageAsync()
    {
        this.Message = new MailMessage(this.MailFrom.ToString(), this.MailTo.ToString(), this.GetSubject(), this.GetMessageBody());
        //Message.Dispose();

        try
        {
            await this.Client.SendMailAsync(this.Message);
        }
        catch (Exception ex)
        {
            Logger.LogInformation("The Email couldn't send to the recipient");
        }
    }

Я получил сообщение об ошибке при отправке вам электронного письма с деталями заказа. в представлении. Я хочу, чтобы GetIsCompleted () возвращал true для продолжения кода. Разрабатывается под .net core. Я не понимаю, почему IsCompletedSuccessfully () не возвращается true; Любое предложение?

Заранее спасибо!

1 Ответ

0 голосов
/ 14 мая 2018

Текущий поток вашего кода такой:

  1. Начните отправку электронной почты.
  2. Проверьте, успешно ли завершено, решите, что нет, и верните ошибку.
  3. Электронная почта завершает отправку.

Вы ожидаете фактический метод 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 поглощает все другие исключения.

...