【问题标题】:How to wait on an async method in third party library - web api如何等待第三方库中的异步方法 - web api
【发布时间】:2016-12-05 20:20:42
【问题描述】:

我正在使用 SendGrid(基于云的 SMTP 服务)从 Web api 项目发送电子邮件。我希望我的应用程序等待/阻塞(例如 30 秒),直到收到来自 SendGrid 的响应,然后再将响应返回给客户端,而不是立即返回。 SendGrid 库有一个 DeliverAsync 方法,它返回一个任务。

我一直在研究如何等待任务。

我已经阅读了无数关于如何做到这一点的文章,并且明白如果这是我自己的代码,我会在任务上使用 ConfigureAwait(false) 来防止死锁并允许我等待。这里的问题是代码不是我的!看起来 SendGrid 没有同步的 Send 方法。

我没有连接异步控制器,虽然很欣赏这是一种方法,但我想知道是否有另一种方法可以做到这一点。

希望这是有道理的!

【问题讨论】:

  • 如果您在 Web APi 中使用第三方库 - 那么您可以使用 await 并且控制器只会在任务完成后返回。
  • 如果在代码中使用 await 关键字没有意义,您可以添加“.GetAwaiter().GetResult();”到异步 SendGrid 调用结束,它将等待异步函数完成。
  • 在 ASP:NET Web API 异步方法用于更有效的线程使用。在 WPF 或 Winforms 中,异步方法将在任务完成时释放 UI 线程以进行其他操作,从而通过“非阻塞”UI 线程使 UI “响应”。
  • @Kyle 这只会使程序死锁。

标签: c# asynchronous async-await asp.net-web-api2 sendgrid


【解决方案1】:

如果您可以一直等待直到并包括控制器操作,您应该这样做,因为这是您的代码,它应该是可以实现的。在这种情况下,您最多可能只想将ConfigureAwait(true) 用于从控制器方法的调用,并将其余的(向下)作为ConfigureAwait(false)(作为库方法应该是)。大多数情况下,您甚至不需要保存在控制器操作中的上下文——这取决于你在那里做什么——在这种情况下,也可以在那里使用ConfigureAwait(false)

您使用“等待/阻止”,就好像它们是相同的,但在 TAP 世界中它们完全不同。使用await等待 SendGrid() 调用完成后再继续,而不是阻塞调用线程。

如果你不能这样做,那么使用阻塞 .Wait().Result 或其他人提到的 GetAwaiter().GetResult() 就不太可取了。所有 3 也将阻止调用者。在 Web API 中,您通常可以侥幸逃脱;但在其他情况下 - 例如WinForms - 你可能不会。

因为这是您的代码,请使用await

【讨论】:

  • 感谢您的回复。目前,一直等待对我来说不是一个选择,尽管我知道这是最好的解决方案。我认为所有其他建议都会被阻止,因为第 3 方库不会通过其 await 调用调用 ConfigureAwait(false)。所以,我认为这是图书馆的问题,所以将与他们联系以获取更多信息......
  • 如果你不能等待,就做 .Result 但这将是一个阻塞调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多