我有一个应用程序,在我调用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
知识的绝佳来源。