异步和等待总是返回"等待完成"

kal*_*le1 1 c# async-await

我有一个应用程序,我在调用其他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).

我在这里错过了什么?为什么不等到它完成?

Col*_*inM 5

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知识来源.