我有一个应用程序,在我调用REST Web服务时使用Async和Await。运行单元测试时,即使正在使用等待,我似乎也无法获得任何正确的响应。这是异步方法:

public async Task<Response> SendEmail(string apiKey, string senderEmail, string senderName, string recipientEmail, string recipientName, string subject, string content, bool html)
{
    var client = new SendGridClient(apiKey);
    var from = new EmailAddress(senderEmail, senderName);
    var to = new EmailAddress(recipientEmail, recipientName);
    var msg = MailHelper.CreateSingleEmail(from, to, subject, html ? null : content, html ? content : null);
    var response = await client.SendEmailAsync(msg);

    return response;
}


调用方法如下所示:

public static object SendEmail(string apiKey, string senderEmail, string senderName, string recipientEmail, string recipientName, string subject, string content, bool html)
{
    EmailHandler emailHandler = new EmailHandler();
    var response =  emailHandler.SendEmail(apiKey, senderEmail, senderName, recipientEmail, recipientName, subject, content, html);

    return response;
}


现在,如果在调用函数中的返回响应上设置断点,则可以看到状态为“等待激活”和结果为“尚未计算”的对象。我所能收集到的东西,在返回的对象上调用.Result应该使它同步运行并返回结果。 (例如,请求的状态码,例如200)。

我在这里想念什么?为什么不等到完成?

最佳答案

async-await只是关键字,它们告诉编译器将其编译为IAsyncStateMachine的实现并等待其完成,这两个关键字需要结合使用才能起作用,并且它们仅在Task上起作用对象。 Task表示正在发生的一件工作。

您必须将SendEmail方法标记为async,将返回类型更改为Task<object>,然后将await更改为emailHandler.SendEmail调用。

最重要的是,如果要使用async,则必须一直向上async,并在某些或许多点上使用await,否则,您将开始同步运行异步代码,这是一种在脚丫子。

public static async Task<object> SendEmail(string apiKey, string senderEmail, string senderName, string recipientEmail, string recipientName, string subject, string content, bool html)
{
    EmailHandler emailHandler = new EmailHandler();
    var response = await emailHandler.SendEmail(apiKey, senderEmail, senderName, recipientEmail, recipientName, subject, content, html);

    return response;
}


与往常一样,Stephen Cleary是获取async知识的绝佳来源。

10-05 20:33
查看更多