异步处理使用MVC的RSS订阅源
问题描述:
在我正在处理的项目中,客户想要将RSS订阅源合并到他们的网站新闻项目中。异步处理使用MVC的RSS订阅源
该网站已经有一个由数据库中提取的NewsItems填充的新闻订阅源。
我的想法是定期(每20分钟左右)使用rss订阅源,但我不确定在订阅源更新时试图查看新闻页面的客户端会产生什么样的影响。
我的想法是使用ThreadPool.QueueUserWorkItem消耗饲料,处理它,并添加新的项目到数据库/ lucene索引/添加标签等,但我的异步编程经验几乎为零。
QueueUserWorkItem会生成一个新的线程来执行工作而不会阻塞客户端线程吗?更新结束后会发生什么?
我的想法做这样的:
public class ExternalRSS
{
private readonly SettingsDTO Settings;
public ExternalRSS()
{
Settings = Application.FetchSettings();
RunAsynchronously(ProcessFeed);
}
public static void RunAsynchronously(Action method)
{
ThreadPool.QueueUserWorkItem(i =>
{
try
{
method();
}
catch (ThreadAbortException ex) { /*log*/}
catch (Exception ex){/*log*/}
});
}
private void ProcessFeed()
{
if(Settings != null)
{
using (var reader = XmlReader.Create(Settings.FacebookRssFeed))
{
var rssData = SyndicationFeed.Load(reader);
//do processing etc
}
}
}
}
难道我对这个问题复杂化?
任何意见将受到欢迎!
答
这个恕我直言,不是应该在ASP.NET MVC应用程序内完成的任务。我会使用一个单独的专用Windows服务,它将定期查询远程RSS源并更新数据库。或者定期使用Windows任务计划程序定期运行一个简单的控制台应用程序。重要的部分是写入数据库时:确保它在SQL事务中执行。这样,客户端MVC应用程序在阅读时不会看到损坏的数据。
我还建议您阅读following blog post,其中Phil Haack详细解释了为什么在ASP.NET应用程序中实现这样的周期性后台任务是一个非常糟糕的主意。
嗨达林,我确实考虑过在外部做这件事,但它会使事情稍微复杂化(获得创建此类任务的权限等)。我会和客户谈谈,看看他们能否为我解决这个问题。 – 2012-07-19 15:11:09
嗯,我得到了客户为该网站购买VPS,所以现在我有充分的权限来做我所需要的 - 所以这段代码将作为一个服务箱运行。 – 2012-07-23 08:10:31