我有一个应用程序,我在调用其他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;
}
Run Code Online (Sandbox Code Playgroud)
调用方法如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我在调用函数中的返回响应上放置一个断点,我可以看到一个状态="等待激活"且Result ="尚未计算"的对象.在我能够收集的内容中,在返回的对象上调用.Result应该使它同步运行并返回结果.(例如,请求的状态代码,例如200).
我在这里错过了什么?为什么不等到它完成?
async-await只是告诉编译器将代码编译为a的实现IAsyncStateMachine
并等待它完成的关键字,两个关键字需要结合使用才能使用它们,它们只能处理Task
对象.A 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;
}
Run Code Online (Sandbox Code Playgroud)
一如既往,斯蒂芬克利里是一个很好的async
知识来源.
归档时间: |
|
查看次数: |
241 次 |
最近记录: |