2016-12-05 66 views
0

我正在使用SendGrid(基於雲的SMTP服務)從web api項目發送電子郵件。我希望我的應用程序等待/阻止(比如說30秒),直到SendGrid響應之後纔將響應返回給客戶端,而不是立即返回。 SendGrid庫有一個返回Task的DeliverAsync方法。如何等待第三方庫中的異步方法 - web api

我一直在看我如何等待任務。

我已經閱讀了無數篇關於如何做到這一點的文章,並瞭解如果它是我自己的代碼,我會在任務上使用ConfigureAwait(false)來防止死鎖並讓我等待。這裏的問題是代碼不是我的!它看起來不像SendGrid有一個同步發送方法。

我沒有異步控制器連線,但欣賞這將是一種方法來做到這一點,但我想知道是否有另一種方式我可以做到這一點。

希望這是有道理的!

+1

如果您在Web APi中使用第三方庫 - 那麼您可以使用'await',並且控制器只有在任務完成後纔會返回。 – Fabio

+0

如果在代碼中使用await關鍵字沒有意義,可以添加「.GetAwaiter()。GetResult();」到異步SendGrid調用的結尾,它將等待異步函數完成。 – Kyle

+0

在ASP中:NET Web API異步方法用於更有效的線程使用。在WPF或Winforms中,異步方法將在任務完成時爲其他操作釋放UI線程,從而使UI「響應」「非阻塞」UI線程。 – Fabio

回答

0

如果你可以一直等待和包括控制器動作,你應該,因爲這是你的代碼應該是可以實現的。在這種情況下,您最多隻需要考慮ConfigureAwait(true)來自控制器方法的調用,並將其餘(向下)作爲ConfigureAwait(false)(如庫方法應該)。大多數情況下,你甚至不需要控制器操作中保存的上下文 - 這取決於你在那裏做什麼 - 在這種情況下,也可以使用ConfigureAwait(false)

您使用「等待/阻止」,就好像它們是一樣的,但在TAP世界中它們完全不同。使用await等待SendGrid()調用完成之前繼續,而不是阻止調用線程。

如果你不能這樣做,那麼使用阻止.Wait().Result或其他人提到GetAwaiter().GetResult()的方法是不太可取的。所有3個也將阻止呼叫者。在Web API中,您經常可以逃避這一點;但在其他情況下 - 例如WinForms - 你可能不會。

因爲這是您的代碼,請使用await

+0

感謝您的回覆。儘管我明白這是最好的解決方案,但對於我來說,等待所有方式目前不是一種選擇。我認爲所有其他建議都會阻止,因爲第三方庫不會通過其等待調用調用ConfigureAwait(false)。所以,我認爲這是圖書館的問題,所以會聯繫他們以獲得更多信息... – user644698

+0

如果您無法等待,請執行.Result,但這將是一個阻止呼叫。 – alltej