【问题标题】:async/await problems getting system to wait for response异步/等待问题让系统等待响应
【发布时间】:2013-09-03 16:17:29
【问题描述】:

我有一封使用网络请求获取不同部分(文本、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.Result,然后它才会真正等待。

ie:这将不等待完成:

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

但这会(注意“结果”被要求:

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

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

【问题讨论】:

  • 您正在同步等待异步操作的结果。这很少是一个好主意。您应该将调用方法 async 和 await 改为您的异步操作。

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


【解决方案1】:

这正是您的代码所做的。

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

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

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

【讨论】:

  • 这就是我的想法,但是当我单步执行代码时,它会到达 await 语句并立即存在该函数并继续执行我的程序。我希望它停在“await subjectTask”直到它完成,然后停在“await bodyTask”直到它完成,然后一旦两者都完成,我希望它返回到我的程序。
  • Ahhhh,发现我的错误,解决方案添加到问题中。感谢您的帮助!
猜你喜欢
  • 2011-09-03
  • 2020-09-26
  • 2021-10-11
  • 1970-01-01
  • 2020-12-03
  • 2018-12-09
  • 1970-01-01
  • 2022-10-25
  • 2020-12-09
相关资源
最近更新 更多