【问题标题】:C# Await does not seem to wait for Http server to respondC# Await 似乎没有等待 Http 服务器响应
【发布时间】:2020-02-22 20:10:59
【问题描述】:

在这段代码中sn-p:

responseMessage = await HttpClient.SendAsync(requestMessage);

程序结束执行(退出代码为 0),就好像没有发生任何错误一样,不再从该行继续。但是,根据我对await的理解,基本上应该阻塞,直到方法返回HttpResponseMessage,然后依次继续。

下面这段代码 sn-p 似乎做了我认为上面的代码:

Task<HttpResponseMessage> sendAsyncTask = HttpClient.SendAsync(requestMessage);

sendAsyncTask.Wait();

responseMessage = sendAsyncTask.Result;

为什么会这样?第一个代码sn-p有什么问题?

【问题讨论】:

  • await 将调用放在一个工作线程上,如果主线程退出,则程序执行结束。
  • @EmanuelVintilă 不,它不会这样做
  • 显示整个程序。
  • 请提供更多信息,从代码执行开始到此时,您的代码看起来如何。如果您尝试在不支持异步的执行路径中等待 httpclient 方法,则会发生这种情况。
  • 可能和我回答here的问题一样。

标签: c# asynchronous async-await httpclient


【解决方案1】:

程序结束执行(退出代码为 0),就好像没有发生任何错误一样,不再从该行继续。

很可能,您的 Main 方法(或介于 Main 和这个之间的其他方法)调用异步方法,然后忽略返回的任务而不是 awaiting 它。或者你在某处有一个async void

但是,根据我对await的理解,基本上应该阻塞,直到方法返回HttpResponseMessage,然后依次继续。

await 的全部意义在于它不会阻塞调用者。 await 确实“暂停”了该方法,以便它可以稍后“恢复”,但await 在任务进行时也返回给它的调用者。如果调用者随后退出应用程序(例如,通过退出 Main),则该方法永远不会有机会恢复,因为应用程序已被拆除。

【讨论】:

  • 这就是问题所在!我在堆栈中有一个较低的方法是“公共异步无效”,但是在尝试等待该方法之后,我得到了一个错误。经过一番搜索,我发现如果你打算等待它,void 应该返回 Task。
猜你喜欢
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2020-12-30
  • 2021-07-21
  • 1970-01-01
  • 2018-02-21
相关资源
最近更新 更多