ASP.NET全局后台工作者线程

时间:2014-02-18 21:42:11

标签: c# asp.net multithreading

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

要求:

  1. 工人永远不应该超时。

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

  3. 不应该为每个请求创建worker,而应该创建一个在服务器启动时运行的全局线程

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

    编辑:

    我使用Windows Azure来托管网站,所以我不认为我可以创建一个Windows服务来运行任务

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

这样,如果你考虑一下,你的应用程序部署会更容易 - 没有胜利服务或部署的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();

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

通常,Web服务器设计用于提供网页。请求进来,HTML页面(以及其他内容)熄灭。除非您完全控制服务器,否则您要做的事情很难实现。