gpt4 book ai didi

asp.net - 在 IIS 中使用线程的特殊注意事项

转载 作者:行者123 更新时间:2023-12-02 19:48:18 25 4
gpt4 key购买 nike

我想开始在 IIS 中使用异步处理。编辑:我正在谈论使用任务并行库。

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

所以通常我所做的就是有一个静态队列,将日志信息推送到其中,然后有一个 cron 作业,每 10 分钟调用一个特殊页面,该页面的 OnLoad 会刷新队列。这可行,但设置起来有点笨拙,尤其是当您想要记录 50 件事时。我宁愿这样做:

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

但是,我害怕在 IIS 中运行任务,因为一旦出现问题,整个网站就会瘫痪。

所以现在我有了

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

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

既然我可以在 IIS 中安全地异步运行内容,那么在开始使用 SafeTask 类之前我还需要担心哪些其他事情?

最佳答案

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

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

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

希望这有帮助。

关于asp.net - 在 IIS 中使用线程的特殊注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com