【发布时间】:2019-02-22 09:03:58
【问题描述】:
我有一个应用程序,我在调用 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)。
我在这里缺少什么?为什么不等到完成?
【问题讨论】:
-
你需要使
SendEmail异步。看来你的僵局了 -
您从 SendEmail 返回的响应是尚未完成的任务。尝试明确指定类型,而不是使用
object和var。这样,当您不使用您认为的类型时,您会遇到编译错误。 -
SendEmailAsync是如何定义的? -
@GSerg 将
object作为返回类型意味着可以返回Response或Task<Response>。如果 OP 使该方法返回Response,那么它将无法编译。至于var,我猜Hans的意思是如果他们使用Response而不是var,那也会产生编译错误。
标签: c# async-await