【问题标题】:ASP.NET global background worker threadASP.NET 全局后台工作线程
【发布时间】:2014-02-18 21:42:11
【问题描述】:

我想创建一个后台线程来定期从另一台服务器提取数据并向用户发送实时电子邮件警报。

要求:

  1. worker 永远不应该超时。

  2. worker 应该在单独的线程上运行,这意味着服务器在运行时应该仍然能够处理用户的请求

  3. 不应根据请求创建工作线程,而应将其作为将在服务器启动时运行的全局线程

我知道为每个请求创建一个后台线程是个坏主意,但是全局后台工作线程的最佳做法是什么? 提前致谢

已编辑:

我正在使用 Windows Azure 来托管该站点,所以我认为我不能创建一个 Windows 服务来运行该任务

【问题讨论】:

  • 你重新搜索过什么吗? C# asyc 和任务并行是我想到的几个
  • 不要使用 Web 应用程序来执行后台进程,而是使用适当的工具,例如Windows 服务。

标签: c# asp.net multithreading


【解决方案1】:

通常,您不会在 Web 应用程序本身中运行此类任务,因为应用程序池将在一段时间不活动后关闭,具体取决于环境的配置。

要使这项工作以可靠的方式进行,请创建一个单独的应用程序,定期检索数据并发送警报。有几种方法可以实现这一点:

  1. 一种非常轻量级的方法是创建一个控制台应用程序并让一个调度程序(例如 Windows 任务调度程序)定期运行它。
  2. 更复杂的方法是创建一个在系统启动时启动并定期执行任务的 Windows 服务。
  3. 如果您的应用程序集成到特定环境中,则可能已经有可用的调度组件,例如在 SharePoint 中,您可以实现作业并让 Timer 服务运行这些作业。

【讨论】:

    【解决方案2】:

    我需要类似的东西来构建刮板。我所做的是使用 .Net ThreadPool 类来发送异步 http 请求。我构建了一个用于使用状态对象构建异步请求的包装器,然后调用:

    ThreadPool.QueueUserWorkItem(new WaitCallback(asyncWrapper.BeginGetMethod), asyncStateObject);
    

    【讨论】:

    • -1:在 ASP.NET 应用程序中是个坏主意,尤其是当线程依赖于页面中的任何状态时。
    【解决方案3】:

    大多数人会建议您使用 Windows 服务来完成它。然而,一个合理的方法是使用像 Quartz .NET 这样的调度框架: http://quartznet.sourceforge.net/

    这样一来,如果您考虑一下,您的应用程序部署甚至会更容易 - 无需部署 win 服务或 EXE。

    因此,如果您决定这样做并将其嵌入到您的 ASP.NET 应用程序中运行,那么您可以开始在Global.Asax文件中使用它,地址为Application_Start(),如下所示:

    NameValueCollection properties = new NameValueCollection();
    properties["quartz.scheduler.instanceName"] = "RemoteServer";
    
    // set thread pool info
    properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
    properties["quartz.threadPool.threadCount"] = "5";
    properties["quartz.threadPool.threadPriority"] = "Normal";
    
    ISchedulerFactory sf = new StdSchedulerFactory(properties);
    IScheduler sched = sf.GetScheduler();
    sched.Start();
    

    【讨论】:

      【解决方案4】:

      通常,Web 服务器是为提供网页而设计的。请求进来,HTML 页面(除其他外)出去。除非您完全控制服务器,否则您尝试做的事情将很难实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 2011-06-18
        相关资源
        最近更新 更多