如何通过同步方法使用SendGrid C#库发送电子邮件?

问题描述

我需要从使用同步方法的Asp.net WebForms应用程序发送电子邮件。我知道我可以使用SMTP发送电子邮件,但是我想使用SendGrid C#库API发送电子邮件,该API更快(根据我的测试)。 https://github.com/sendgrid/sendgrid-csharp

这是我的代码。以下五种方法中的哪一种是正确的?它们都能正常工作,Visual Studio不会显示任何错误。我不想使用不正确的方法在生产网站中引起错误

static void SendSampleEmailSync()
{
    var client = new SendGridClient(apiKey);
    var from = new EmailAddress("[email protected]","example user");
    var subject = "Sending with Twilio SendGrid is Fun";
    var to = new EmailAddress("[email protected]","example user");
    var plainTextContent = "and easy to do anywhere,even with C#";
    var htmlContent = "<strong>and easy to do anywhere,even with C#</strong>";
    var msg = MailHelper.CreateSingleEmail(from,to,subject,plainTextContent,htmlContent);

    // Method 1
    var task = Task.Run(() => client.SendEmailAsync(msg));
    var result = task.Result;

    // Method 2
    var result2 = client.SendEmailAsync(msg).Result;

    // Method 3
    _ = client.SendEmailAsync(msg);

    // Method 4
    client.SendEmailAsync(msg).ConfigureAwait(false);

    // Method 5
    var result4 = Task.Run(() => client.SendEmailAsync(msg)).GetAwaiter().GetResult();
}

解决方法

从我在本页上看到的内容:https://docs.microsoft.com/en-us/archive/msdn-magazine/2015/july/async-programming-brownfield-async-development#the-thread-pool-hack

最好的方法似乎是使用此方法:

var result = Task.Run(() => client.SendEmailAsync(msg)).GetAwaiter().GetResult();
,

您可以这样使用。

static async Task Execute()
    {
        var apiKey = Environment.GetEnvironmentVariable("NAME_OF_THE_ENVIRONMENT_VARIABLE_FOR_YOUR_SENDGRID_KEY");
        var client = new SendGridClient(apiKey);
        var from = new EmailAddress("[email protected]","Sample User");
        var subject = "Sending with SendGrid is Fun";
        var to = new EmailAddress("[email protected]","Sample User");
        var plainTextContent = "and easy to do anywhere,even with C#";
        var htmlContent = "<strong>and easy to do anywhere,even with C#</strong>";
        var msg = MailHelper.CreateSingleEmail(from,to,subject,plainTextContent,htmlContent);
        var response = await client.SendEmailAsync(msg);
    }