代码之家  ›  专栏  ›  技术社区  ›  Kevin Montrose

在ASP.NET中使用线程有没有不明显的危险?

  •  7
  • Kevin Montrose  · 技术社区  · 14 年前

    这是个兄弟的问题 this programmers question

    简单地说,我们正在“适当地”将一些支持用户请求的工作推到后台。链接的问题给了我很多我们应该走服务路线的想法,但并没有提供任何令人信服的论据来说明为什么我们应该走服务路线。

    我承认,对我来说

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

    是非常有说服力的,所以如果只是有点困难(而不是天生不可行),我倾向于采用后台线程方法。

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

    • 由于AppPool被回收,它们随时都可能死亡
    • 这个 ThreadPool
      • 解决方案:构建自己的线程池,同时限制线程的数量。

    我的问题是, 我缺了什么,如果有的话? ASP.NET中的后台线程还会出什么问题?

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

    4 回复  |  直到 8 年前
        1
  •  3
  •   Community CDub    8 年前

    我将远离在您的IIS AppDomain中为StackOverflow从启动线程。我没有任何确凿的证据来支持我要说的话,但与I is合作10年,我知道当它是镇上唯一的游戏时,效果最好。

    还有一个选择,我知道这会是 take off on my answer 在程序员线程上。但据我所知,您已经有了一个解决方案,可以通过支持用户请求来工作。为什么不使用该代码,而只在调用特殊的内部API时启动它。然后使用 Task Scheduler 打电话给 CURL 命令,每隔30秒左右调用该API以启动任务。这样,您就可以让IIS处理线程,而您的代码则可以处理一些它已经很容易做到的事情。

        2
  •  2
  •   Jeff    14 年前

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

        3
  •  1
  •   Cyril Gupta    14 年前

    我来告诉你一个不明显的危险:)

    我用线程收集更新一些RSS提要到我的数据库中,我是一个网站托管与GoDaddy。线程运行良好(如果它们被终止,它们将自动重新启动,因为我在某些网页中构建了一些检查)。

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

    如果这不是不明显的,那是什么?

        4
  •  0
  •   Shiraz Bhaiji    14 年前

    其中一个可能是,你过分复杂化了你的架构,却没有得到任何好处。