在IIS中使用线程的特殊注意事项

时间:2011-08-30 02:40:38

标签: asp.net iis

我想在IIS中开始使用异步处理。编辑:我说的是使用任务并行库。

例如,在某些页面加载时,我想记录一堆废话,发送电子邮件,更新一些表等等。但我不想让用户等我记录所有废话。

通常我所做的是我有一个静态队列,我将日志信息推送到,然后我有一个cron作业,每10分钟调用一个特殊页面,其OnLoad刷新队列。这有效,但设置起来很笨,特别是当你想记录50件事时。我宁愿这样做:

Task.CreateNew(() => Log(theStuff));

但是我害怕在IIS中运行任务,因为一个故障导致整个网站崩溃。

所以现在我有了

SafeTask.FireAndForget(() => Log(theStuff));

这将委托包装在一些try / catch中并将其传递给Task.CreateNew。因此,如果某人更改了某些影响其他事件的事情,这些事件会在其他地方产生异常而意外地被抛到任务线程上,我们会收到通知而不是崩溃的网站。此外,catch中的错误通知也在其自己的try / catch中,而catch的catch也有一个尝试以不同方式登录的try / catch。

现在我可以安全地在IIS中异步运行东西,在开始使用我的SafeTask类之前,我需要担心哪些其他事情?

2 个答案:

答案 0 :(得分:1)

考虑使用页面的OnUnload事件。在此处阅读:http://msdn.microsoft.com/en-us/library/ms178472.aspx

此事件在将内容发送给用户后触发(因此在您工作时不会阻止用户),并且应该完全满足您的要求而不引入其他线程。

特定于您的问题,只有当您的负载和性能测试表明您遇到线程限制时,才应该关注线程池耗尽。如果你不是那么你的建议肯定是合理的。

答案 1 :(得分:1)

默认情况下,IIS和.net中的每个请求都在一个线程中处理。该线程来自称为“应用程序池”的线程池。现有线程被重用,因此除非您每次都清除或设置它,否则您无法真正将它们用于线程状态。您可以使用machine.config中的MSDN公式甚至web.config来定义此线程池的大小。

现在,每个异步函数调用都放在不同的线程上。这包括异步Web服务调用,异步页面函数,异步委托等。此线程来自“应用程序池”,从而减少了IIS可用于服务新请求的线程数。

最有可能的是,您的应用程序在使用异步函数调用时可以正常工作。如果您担心或者您有很多异步任务,那么您可能想要创建自己的线程池或在codeplex上查看SmartThreadPool。

希望这会有所帮助。