【问题标题】:Best ASP.NET Background Service Implementation最佳 ASP.NET 后台服务实现
【发布时间】:2009-09-15 02:27:19
【问题描述】:

在 ASP.NET 应用程序中实现多个后台服务的最佳方式是什么?

  1. 定时器回调

    Timer timer = new Timer(new TimerCallback(MyWorkCallback), HttpContext, 5000, 5000);
    
  2. 线程或线程池

    Thread thread = new Thread(Work);
    thread.IsBackground = true;
    thread.Start();
    
  3. 后台工作人员

    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(DoMyWork);
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DoMyWork_Completed); 
    worker.RunWorkerAsync();
    
  4. 缓存类似于 http://www.codeproject.com/KB/aspnet/ASPNETService.aspx(位于 Jeff Atwood 的 post here

我需要在给定时间运行多个后台“服务”。一项服务可能每 5 分钟运行一次,而另一项服务可能每天运行一次。一次运行的服务永远不会超过 10 个。

【问题讨论】:

    标签: asp.net multithreading background backgroundworker timer


    【解决方案1】:

    好吧,您应该选择 ThreadPool,而不是“简单线程”。

    如果是我,我会在 Windows 服务中运行它并通过 MSMQ 与其通信。

    【讨论】:

    • 我也会运行 Windows 服务,但如果您不确定最终用户是否具有该能力,例如在共享托管环境中,我仍想确定我仍然可以托管这些“服务”。
    • 我将我的简单线程标签编辑为线程池。我还找到了第四个选项 - codeproject.com/KB/aspnet/ASPNETService.aspx。再次感谢您的回复!
    • 关于那个选项;我注意到它只有在有人访问该网站时才会起作用。如果没有人访问,它可能不会从缓存中删除该项目并执行任务。在使用它之前,我会自己检查(我没有)。当然,Windows 服务是最稳定的,如果它作为一个选项存在的话。
    【解决方案2】:

    您应该实现一些任务状态。应用程序回收后,后台服务应修复损坏的任务。如果任务在事务中,那么该行为将没有问题。

    【讨论】:

      【解决方案3】:

      原始发帖人的建议都没有扩展到一台以上的服务器。

      我想要同样的东西: 在不影响当前用户请求的情况下,调度常规后台任务并执行临时繁重处理(重建缓存等)的稳健且简单易用的方式。

      我想让任务在 Web 应用程序上下文中运行,以 a) 从 web.config 获取配置(避免配置重复)和 b) 与 Web 应用程序一起部署(简化部署)。 而且我需要它来为分布在多个服务器上的网站工作。

      我只找到了一种方法可以提供我想要的东西:

      (1) 为每个任务创建一个 .aspx 页面,并在网站上调用此 .aspx 的单独服务器上设置 wget 计划任务。我已经实现了这种方法并且它有效,但我不是 100% 喜欢它,因为计划任务依赖并且它不能让我能够在后台临时执行繁重的任务

      【讨论】:

      • 对于在多个服务器上运行的服务,我强烈建议将其拆分为与 MSMQ 等某种消息队列交互的 Windows 服务。那将是你最好的选择。我正在寻找的是共享托管环境,而不是自托管或虚拟托管环境。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2015-09-06
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多