函数在 await async 完成之前返回

Som*_*ame 0 .net c# asynchronous sendgrid async-await

我正在尝试通过 SendGrid API 发送 2 封电子邮件。有时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;
}
Run Code Online (Sandbox Code Playgroud)

这就是我的称呼:

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

            if (!sendMails.Result)
            {
                errorMessage = "Error sending mails.";
            }
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 6

您正在阻止异步任务:

if (!sendMails.Result)
Run Code Online (Sandbox Code Playgroud)

这会导致死锁。使用await.

你也可以摆脱await Task.FromResult,它根本没有做任何事情

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

if (!sentMails)
{
  errorMessage = "Error sending mails.";
}
Run Code Online (Sandbox Code Playgroud)

  • 这确实花了我一分钟......我认为我以前从未见过传递给“await Task.FromResult”的*任务*。:) (2认同)

Joh*_*lay 5

Task.FromResult返回一个已经完成的新的 Task,而不是Task返回的 from SendMails

没有什么是等待完成的SendMails

只需等待Task从方法返回:

bool result = await SendMails(formCollection["email"], formCollection["name"], pdfPath, imgPath);
Run Code Online (Sandbox Code Playgroud)

await关键字解开了Task.Result你。