在ASP.NET中使用线程有任何非明显的危险吗?

时间:2010-10-22 05:14:12

标签: c# asp.net multithreading asp.net-mvc-2

this programmers question这是一个兄弟问题。

简单地说,我们正在考虑将一些背负用户请求的工作推送到后台“正确”。如果我们选择服务路线,这个相关的问题给了我很多想法,但并没有真正提供任何令人信服的论据,说明为什么我们应该这样做。

我会承认,对我来说,能够做到道德等同于

WorkQueue.Push(delegate(object context) { ... });

真的很引人注目,所以如果它有点困难(而不是天生就不可行),我倾向于采用后台线程方法。

所以,我知道的背景线程的问题(在AppPool的上下文中):

  • 由于AppPool被回收,他们可能随时死亡
    • 解决方案:跟踪任务执行的时间,因此可以重新运行*如果需要新线程
  • ThreadPool用于响应传入的HTTP查询,因此使用它可能会使IIS饿死
    • 解决方案:构建我们自己的线程池,同时限制线程数。

我的问题是,我缺少什么,如果有的话?在ASP.NET中使用后台线程会出现什么其他问题?

*问题中的任务已经安全重新运行,所以这不是问题。
ǂ假设我们没有做任何真正愚蠢的事情,比如在后台线程中抛出异常。

4 个答案:

答案 0 :(得分:3)

我将远离启动用于StackOverflow的IIS AppDomain中的线程。我没有任何确凿的证据支持我要说的话,但是与IIS合作已经10年了,我知道它是城里唯一的游戏,效果最好。

还有另一种选择,我知道这对程序员线程来说会是take off on my answer。但据我所知,你已经有了一个解决方案,通过捎带工作用户请求。为什么不使用该代码,而只在调用特殊内部API时启动它。然后使用Task Scheduler调用CURL命令,该命令每隔30秒左右调用该API以启动任务。这样,您就可以让IIS处理线程,并且您的代码正在处理它已经轻松完成的任务。

答案 1 :(得分:2)

我遇到的一个危险是CallContext。我们使用CallContext来设置用户身份数据,因为我们的Web应用程序和基于.NET Remoting的应用程序服务(旨在使用CallContext存储调用特定数据)共享相同的代码 - 所以我们没有使用HttpContext。

我们注意到,有时,新请求最终会在CallContext中出现非空身份。换句话说,ASP .NET没有将请求之间存储在CallContext中的数据归零...因此,如果未经身份验证的用户选择了仍然具有包含经过验证的用户身份信息的CallContext的线程,则可能会进入应用程序。 / p>

答案 2 :(得分:1)

让我告诉你一个非显而易见的危险:)

我使用线程收集更新一些RSS提要到我的数据库,用于我使用GoDaddy托管的网站。线程工作正常(如果它们被终止,由于我在某些网页中构建的一些检查,它们将自动重启)。

它工作出色,我非常高兴,直到GoDaddy(我的主持人)第一次开始杀死线程,然后完全阻止它们。所以我的应用程序刚刚死了!

如果那不是非显而易见的,那是什么?

答案 3 :(得分:0)

一个可能是你过度复杂化你的架构而没有任何好处。

你的程序编写成本会更高,维护成本更高,并且更容易出错。

相关问题