这是一个兄弟姐妹的问题这个程序员的问题 https://softwareengineering.stackexchange.com/questions/13711/servicing-background-tasks-on-a-large-site.
简而言之,我们正在考虑将一些依赖用户请求的工作“适当地”推入后台。链接的问题给了我很多想法,我们是否应该走服务路线,但并没有真正提供任何令人信服的论据来说明为什么我们应该走。
我承认,对我来说,做道德上等同的事情的能力
WorkQueue.Push(delegate(object context) { ... });
确实很引人注目,所以如果它只是有点困难(而不是本质上不可行),我倾向于采用后台线程方法。
因此,我知道的后台线程的问题(在应用程序池的上下文中):
- They can die at any time due to the AppPool being recycled
- 解决方案:跟踪任务何时执行,以便在需要新线程时可以重新运行*
- The ThreadPool http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx is used to respond to incoming HTTP queries, so using it can starve IIS
- 解决方案:建立我们自己的线程池,同时限制线程数量。
我的问题是,我错过了什么(如果有的话)?ASP.NET 中的后台线程还会出现什么问题?
* The task in questions are already safe to re-run, so this isn't a problem.
ǂ Assume we're not doing anything really dumb, like throwing exceptions in background threads.
我不会从 StackOverflow 的 IIS AppDomain 中启动线程。我没有任何确凿的证据来支持我要说的话,但是使用 IIS 10 年了,我知道当它是城里唯一的游戏时效果最好。
还有一个替代方案,我知道这将是一种采纳我的答案 https://softwareengineering.stackexchange.com/questions/13711/servicing-background-tasks-on-a-large-site/13732#13732在程序员线程上。但据我了解,您已经有了一个解决方案,可以根据用户请求进行工作。为什么不使用该代码,而只在调用特殊的内部 API 时才启动它。然后使用Task Scheduler
打电话给CURL
每 30 秒左右调用该 API 来启动任务的命令。通过这种方式,您可以让 IIS 处理线程,并且您的代码可以处理一些它已经可以轻松完成的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)