在我的ASP.NET MVC应用程序中,我有许多线程等待一段时间,然后醒来一遍又一遍地执行一些干净的任务。我还没有将此应用程序部署到生产服务器,但在我的开发机器上,它们似乎按预期工作。为了使这些线程在IIS7上工作相同,我需要注意什么吗? IIS7会无限期地让我的线程保持活力吗?有担心吗?
此外,我想排队,假设通过各种请求创建的50个对象,并一次性处理它们。我想将它们保存在列表中,然后处理列表,这意味着列表对象必须无限期地保持活动状态。我想避免将我的对象序列化到数据库中以维护此队列。实现这一目标的正确方法是什么?
答案 0 :(得分:1)
IIS7会保持我的线程活着吗? 无限期?
不,如果应用程序池回收(如果长时间不活动或某个内存阈值被命中),那么这些线程将被停止,因为应用程序将从内存中卸载。如果这些对象非常精确,我建议不要将它们保存在内存中,而是将它们序列化为一些持久存储,以便以后可以在发生故障时进行处理。
答案 1 :(得分:1)
当您不介意丢失队列中的缓存命令时,您描述的设计很好。否则最好选择不同的设计。 ASP.NET不适合这种类型的处理,因为IIS可以回收该进程。当发生这种情况时,您将丢失内存中的队列。 IIS也可以决定卸载AppDomain,因为没有新请求进入。在这种情况下,您的线程也将停止运行,这意味着即使您使用持久队列,仍然不会缓存挂起的操作。
您可能更适合使用某种事务队列,例如MSMQ或数据库中的自定义表(或查看开源NServiceBus)。可以通过Web应用程序向队列添加操作,处理项可以在Windows服务应用程序中完成,该应用程序不会被回收,并且可以以事务方式处理队列。
由于您正在讨论多个线程:使用Windows服务时,您可以构建它,以便它可以运行多个线程或使其成为单线程并运行同一线程的多个实例。这是一个非常灵活的设计,我过去成功地使用它来在多台机器上分配CPU和磁盘密集型操作。