1

在我正在进行的一个项目中,客户希望将 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
            }
        }
    }
}

我是不是把问题复杂化了?

任何建议都会受到欢迎!

4

1 回答 1

1

恕我直言,这不是应该在 ASP.NET MVC 应用程序中完成的任务。我会使用一个单独的专用 Windows 服务,它会定期查询远程 RSS 提要并更新数据库。或者一个简单的控制台应用程序,使用 Windows 任务计划程序计划定期运行。重要的部分是写入数据库时​​:确保它是在 SQL 事务中执行的。这样,客户端 MVC 应用程序在读取数据时就不会看到损坏的数据。

我还建议您阅读以下博客文章,其中 Phil Haack 详细解释了为什么在 ASP.NET 应用程序中实现此类经常性后台任务是一个非常糟糕的主意。

于 2012-07-19T15:07:45.840 回答