Asyn c обещание не ожидается до возврата заявления - PullRequest
0 голосов
/ 07 февраля 2020

Была эта проблема вчера, изменили какой-то код, и это происходит снова ... Почему не отправляются обе письма? Обещание не ожидается. Иногда отправляется 1, иногда 2 письма. Bool "messagesSent" также иногда возвращает false, когда он должен возвращать true.

Функция:

private async Task<bool> SendMails(string email, string name, string pdfPath, string imgPath)
{
    var client = new SendGridClient(_config["SendGrid:Key"]);
    bool messagesSent = false;
    try
    {
        var messageClient = new SendGridMessage
        {
            From = new EmailAddress(_config["SendGrid:Recipient"]),
            Subject = "Subject1",
            HtmlContent = _textManager.Get("email-b")
        };

        var MessageServer = new SendGridMessage
        {
            From = new EmailAddress(_config["SendGrid:Recipient"]),
            Subject = "Subject2",
            HtmlContent = _textManager.Get("email-s")
        };

        messageClient.AddTo(email, name);
        MessageServer.AddTo(email, name);

        string[] fileListClient = new string[] { pdfPath };
        string[] FileListServer = new string[] { pdfPath, imgPath };

        foreach (var file in fileListClient)
        {
            var fileInfo = new FileInfo(file);

            if (fileInfo.Exists)
                await messageClient.AddAttachmentAsync(fileInfo.Name, fileInfo.OpenRead());
        }

        foreach (var file in FileListServer)
        {
            var fileInfo = new FileInfo(file);

            if (fileInfo.Exists)
                await MessageServer.AddAttachmentAsync(fileInfo.Name, fileInfo.OpenRead());
        }

        var responseClient = await client.SendEmailAsync(messageClient);
        var responseServer = await client.SendEmailAsync(MessageServer);

        if (responseClient.StatusCode.ToString() == "202" && responseServer.StatusCode.ToString() == "202")
        {
            messagesSent = true;
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
    return messagesSent;
}

Вызывается по:

                bool sentMails = await SendMails(formCollection["email"], formCollection["name"], pdfPath, imgPath);

                if (!sentMails)
                {
                    errorMessage = "Error sending mails.";
                    succes = false;
                }

EDIT: Запрос был действителен, вызов был заблокирован ISP / MailServer. Это не имеет ничего общего с неисправным asyn c.

1 Ответ

0 голосов
/ 07 февраля 2020

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

Попробуйте добавить точку останова и посмотрите, почему messagesSent иногда возвращает false, я подозреваю эту строку :

if (responseClient.StatusCode.ToString() == "202" && responseServer.StatusCode.ToString() == "202")

Есть ли вероятность того, что StatusCode может также возвращать "200"?

...