我想创建一个后台线程,定期从另一台服务器提取数据,并向用户发送实时电子邮件警报。
要求:
工人永远不应该超时。
工作者应该在一个单独的线程上运行,这意味着服务器在运行时仍应能够处理用户的请求
不应该为每个请求创建worker,而应该创建一个在服务器启动时运行的全局线程
我知道为每个请求创建一个后台线程是个坏主意,但对于全局后台工作者线程来说,最佳做法是什么? 提前致谢
编辑:
我使用Windows Azure来托管网站,所以我不认为我可以创建一个Windows服务来运行任务
答案 0 :(得分:3)
通常,您不会在Web应用程序本身中运行此类任务,因为应用程序池将在一段时间不活动后关闭,具体取决于环境的配置。
要以可靠的方式完成此工作,请创建一个单独的应用程序,定期检索数据并发送警报。有几种方法可以实现这一目标:
答案 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页面(以及其他内容)熄灭。除非您完全控制服务器,否则您要做的事情很难实现。