Функция возвращается до завершения ожидания asyn c - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь отправить 2 электронных письма через API SendGrid. Иногда 0 отправляет, иногда 1 отправляет, иногда оба отправляют. Кажется, что функция не ждет обещания. Как я могу это исправить, чтобы он всегда отправлял оба письма?

Моя функция выглядит так:

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

    var messageSecondClient = new SendGridMessage
    {
        From = new EmailAddress(_config["SendGrid:Recipient"]),
        Subject = "Second Testmail",
        HtmlContent = _textManager.Get("getSecondMailHtml")
    };

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

    string[] fileListClient = new string[] { pdfPath };
    string[] fileListSecond = 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 fileListSecond)
    {
        var fileInfo = new FileInfo(file);

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

    var responseClient = await client.SendEmailAsync(messageClient);
    var responseSecond = await client.SendEmailAsync(messageSecondClient);

    if (responseClient.StatusCode.ToString() == "202" && responseSecond.StatusCode.ToString() == "202")
    {
        messagesSent = true;
    }
    return messagesSent;
}

И вот как я это называю:

            Task<bool> sendMails = await Task.FromResult(SendMails(formCollection["email"], formCollection["name"], pdfPath, imgPath));

            if (!sendMails.Result)
            {
                errorMessage = "Error sending mails.";
            }

Ответы [ 2 ]

6 голосов
/ 06 февраля 2020

Вы блокируете задачу asyn c:

if (!sendMails.Result)

, и это может вызвать тупик . Вместо блокировки используйте await.

И вы также можете избавиться от await Task.FromResult, который вообще ничего не делает :

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

if (!sentMails)
{
  errorMessage = "Error sending mails.";
}
5 голосов
/ 06 февраля 2020

Task.FromResult возвращает новое Task, которое уже выполнено, а не Task, возвращенное из SendMails.

Ничего не ожидает завершения SendMails.

Просто дождитесь Task, возвращенного методом:

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

Ключевое слово await развернет для вас Task.Result.

...