代码之家  ›  专栏  ›  技术社区  ›  Roman

ASP.NET线程问题

  •  1
  • Roman  · 技术社区  · 14 年前

    在我的ASP.NET MVC应用程序中,我有许多线程在等待一定的时间后醒来,一遍又一遍地执行一些清理任务。我还没有将此应用程序部署到生产服务器上,但在我的开发人员计算机上,它们似乎可以按预期工作。为了让这些线程在iis7上同样工作,我需要注意什么吗?iis7会让我的线程无限期地保持活动吗?有什么值得担心的吗?

    我还想排队,比如说50个通过各种请求创建的对象,并一次性处理它们。我想将它们保存在列表中,然后处理列表,这意味着列表对象必须无限期地保持活动。为了维护这个队列,我希望避免将对象序列化到数据库中。实现这一目标的正确方法是什么?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Darin Dimitrov    14 年前

    iis7能让我的线活下来吗 无限期?

    不,如果应用程序池循环使用(如果长时间不活动或达到某个内存阈值),这些线程将停止,因为应用程序将从内存中卸载。如果这些对象如此精确,我建议您不要将它们保存在内存中,而是将它们序列化到某个持久性存储中,以便以后在发生故障时对它们进行处理。

        2
  •  1
  •   xpda    12 年前

    当您不介意在队列中丢失缓存的命令时,您描述的设计很好。否则最好采用不同的设计。ASP.NET不适合这种类型的处理,因为IIS可以回收该进程。当这种情况发生时,您将丢失内存中的队列。IIS还可以决定卸载AppDomain,因为没有新的请求进入。在这种情况下,线程也将停止运行,这意味着即使使用持久化队列,挂起的操作也不会被缓存。

    您可能更擅长处理某种事务性队列,如msmq或数据库中的自定义表(或查看开放源代码 NServiceBus )向队列中添加操作可以由Web应用程序完成,处理项可以在Windows服务应用程序中完成,该应用程序不会被回收,并且可以以事务方式处理队列。

    因为您谈论的是多线程:当使用Windows服务时,您可以以这样的方式构建它:它可以运行多个线程,或者使它成为单线程,并运行同一线程的多个实例。这是一个非常灵活的设计,我过去成功地将CPU和磁盘密集型操作分布在多台机器上。