我有一封电子邮件,它使用网络请求来获取不同的部分(文字,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;
我希望这篇文章可以帮助其他人解决同样的问题。 快乐的编码!
答案 0 :(得分:3)
这正是你的代码所做的。
调用GetStringAsync()
将启动异步请求。
当你await
第一个时,你的方法将停止执行,直到那个完成;在此期间,其他请求仍将执行。
如果您在开始第二项任务之前await
编辑了第一项任务,那就不会做你想做的事。