我正在使用SendGrid(基于云的SMTP服务)从web api项目发送电子邮件。我希望我的应用程序等待/阻止(例如30秒),直到我在将响应返回给客户端之前得到SendGrid的响应,而不是立即返回。 SendGrid库有一个DeliverAsync方法,它返回一个Task。
我一直在研究如何等待这项任务。
我已经阅读了关于如何做到这一点的无休止的文章,并了解如果它是我自己的代码,我会在任务上使用ConfigureAwait(false)来防止死锁并允许我等待。这里的问题是代码不是我的!它看起来不像SendGrid有一个同步Send方法。
我没有连接异步控制器,虽然我知道这是一种方法,但我想知道是否还有其他方法可以做到这一点。
希望这有意义!!
答案 0 :(得分:0)
如果可以一直等待并包括控制器操作,那么你应该,并且因为这是你的代码,它应该是可以实现的。在这种情况下,您最多只能考虑ConfigureAwait(true)
来自控制器方法的调用,而将其余(下调)视为ConfigureAwait(false)
(因为库方法应该是)。大多数情况下,您甚至不需要在控制器操作中保留上下文 - 这取决于您在那里做什么 - 在这种情况下也使用ConfigureAwait(false)
。
你使用“等待/阻止”就好像它们是相同的,但在TAP世界中它们是完全不同的。在继续之前,使用await
将等待以完成SendGrid()
调用,而不是阻止调用线程。
如果你不能这样做,那么使用阻止.Wait()
或.Result
,或者其他人提到GetAwaiter().GetResult()
则更不可取。所有3个也会阻止来电者。在Web API中,您可以经常使用它;但在其他情况下 - 例如WinForms - 你可能不会。
由于这是您的代码,请使用await
。