如何在第三方库中等待异步方法 - web api

时间:2016-12-05 20:20:42

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

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

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

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

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

希望这有意义!!

1 个答案:

答案 0 :(得分:0)

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

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

如果你不能这样做,那么使用阻止.Wait().Result,或者其他人提到GetAwaiter().GetResult()则更不可取。所有3个也会阻止来电者。在Web API中,您可以经常使用它;但在其他情况下 - 例如WinForms - 你可能不会。

由于这是您的代码,请使用await