async / await让系统等待响应的问题

时间:2013-09-02 15:58:46

标签: c# .net-4.5 async-await

我有一封电子邮件,它使用网络请求来获取不同的部分(文字,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&lt;&gt; .Result。

ie:这将 NOT 等待完成:

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

但这会(请注意“结果”被调用:

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

我希望这篇文章可以帮助其他人解决同样的问题。 快乐的编码!

1 个答案:

答案 0 :(得分:3)

这正是你的代码所做的。

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

当你await第一个时,你的方法将停止执行,直到那个完成;在此期间,其他请求仍将执行。

如果您在开始第二项任务之前await编辑了第一项任务,那就不会做你想做的事。