为什么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
已将HostProtectionAttribute与ExternalThreading
标志打开。这表明ASP.NET将涉及新线程,所以ASP.NET开始保持这些操作的计数等待完成。
如果您需要在WebForms中使用异步方法,则应使用RegisterAsyncTask方法。
谢谢。如果我想调用SendMailAsync,但我不希望WebApi操作等到电子邮件发送时才会这样做?我也不想通过调用Task.Run来绑定一个线程。 – wezten
你可以看看像这样的帖子https://stackoverflow.com/questions/36335345/web-api-fire-and-forget火和遗忘并不是一个很好的建议在网上。如果需要,WebServer可能会终止您的进程。 – hardkoded