2017-07-30 126 views
0

添加以下行(恰好原樣,所以你可以嘗試它太)到一個asp.net的WebAPI動作:爲什麼SendMailAsync會導致asp.net等待,而Task.Delay不會呢?

new SmtpClient { DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory}.SendMailAsync("[email protected]", "[email protected]", "s", "b"); 

,並導致該操作需要等待幾秒鐘,直到拋出一個500錯誤An asynchronous module or handler completed while an asynchronous operation was still pending.很明顯,asp.net檢測到有一個異步任務正在運行。

然而,當我加

Task.Delay(10000); 

馬上行動完成。爲什麼asp.net在這裏沒有檢測到有一個異步任務正在運行?

回答

1

SmtpClient.SendAsync已將HostProtectionAttributeExternalThreading標誌打開。這表明ASP.NET將涉及新線程,所以ASP.NET開始保持這些操作的計數等待完成。

如果您需要在WebForms中使用異步方法,則應使用RegisterAsyncTask方法。

+0

謝謝。如果我想調用SendMailAsync,但我不希望WebApi操作等到電子郵件發送時纔會這樣做?我也不想通過調用Task.Run來綁定一個線程。 – wezten

+1

你可以看看像這樣的帖子https://stackoverflow.com/questions/36335345/web-api-fire-and-forget火和遺忘並不是一個很好的建議在網上。如果需要,WebServer可能會終止您的進程。 – hardkoded

相關問題