让系统等待响应时出现async/await问题

本文关键字:async await 问题 系统 等待 响应 | 更新日期: 2023-09-27 18:29:51

我有一封电子邮件,它使用web请求来获取不同的部分(文本、html和主题)。我希望这个程序能同时得到它们,以减少时间。我在下面写了一个简化的版本,说明我正在努力实现的目标。

public static async Task<MailMessage> GetEmailMessage(string subjectUrl, string bodyUrl)
{
    var mailMessage = new MailMessage();
    var subjectTask = new HttpClient().GetStringAsync(subjectUrl);
    var bodyTask = new HttpClient().GetStringAsync(bodyUrl);
    mailMessage.Subject = await subjectTask;
    mailMessage.Body = await bodyTask;
    return mailMessage;
}

我希望该程序针对主题和正文,一旦两者都有,就返回MailMessage。

我是这个异步的新手,任何帮助都将不胜感激。

=====解决方案======

因此,感谢@SLaks让我意识到问题不在我的职责范围内。这是我调用它的方式。事实证明,在我的情况下(我想是因为我返回的是引用类型而不是值类型),我不得不调用Task<>。结果在它真正完成等待之前。

即:这将等待完成:

var mailMessage = GetEmailMessage("urlhere", "http://www.google.com");

但这将(注意所调用的"结果":

var mailMessage = GetEmailMessage("urlhere", "http://www.google.com").Result;

我希望这篇文章能帮助其他有同样问题的人。编码快乐!

让系统等待响应时出现async/await问题

这正是您的代码所做的。

调用GetStringAsync()将启动异步请求。

当您await第一个时,您的方法将停止执行,直到该方法完成;在该时间期间,另一个请求仍将执行。

如果你在开始第二个任务之前await完成了第一个任务,它就不会完成你想要的。