为什么SendMailAsync会导致asp.net等待,而Task.Delay不会呢?

问题描述:

添加以下行(恰好原样,所以你可以尝试它太)到一个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在这里没有检测到有一个异步任务正在运行?

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