个人网站http://www.massany.cn/之前的版本是在页面打开的时候,才去读取RSS源,以致于第一次访问的时候速度很慢。虽然RSS Toolkit也有自己的缓存机制,但是整体的运行速度还是很慢,而且并不利于一些有价值的新闻内容进行保存。所以考虑了定时多线程读取RSS源的方法。

Global.aspxApplication_Start里,设置了一个定时器,定时读取RSS源。这里的关键是读取RSS源的多线程处理问题,一开始使用了Thread类来启动多个线程,每个线程都访问一个公共的Queue对象来分配读取任务。其实在C#里还有更简单的方法就可以完成多线程操作,使用线程池ThreadPool类。使用ThreadPool可以不必再关注线程的线节,只需要提供回调方法,线程的调度由线程池来完成。

取数据源的代码很简单。

愉快的学习并且进步着(一)DataSet ds = new DataSet();
愉快的学习并且进步着(一)
string strSql = "select DefaultState,ID from Widget where Url = 'Widgets/RssWidget.ascx'";
愉快的学习并且进步着(一)
愉快的学习并且进步着(一)
//出错的频道暂时不进行处理。
愉快的学习并且进步着(一)
if (_ErrQueue.Count > 0)
);

下面将回调方法加入线程池队列:

愉快的学习并且进步着(一)foreach (DataRow dr in ds.Tables[0].Rows)
}
 

回调方法CallBack,要特别注意这个lock,之前的代码并没有这个lock,导致了生插入到数据库中的频道内容顺序是混乱的,有了lock后,保证了插入的记录是按频道来排序的。

愉快的学习并且进步着(一)lock (_Lock)
}



再启动一批线程来处理出错的频道:

愉快的学习并且进步着(一)for (int i = 0; i < _ErrQueue.Count; i++)
}


错误处理回调方法:

愉快的学习并且进步着(一)static void ErrorCallBack(Object stateInfo)
}

 

看看,是简单吧!对于多线程和RSS频道缓存,这是目前我能想到的解决办法,如果大家有更好的主意,不妨交流一下。

我的联系方式:

e-mail:jinyongjinyong@gmail.com

QQ:24615289

相关文章:

  • 2021-08-27
  • 2022-01-19
  • 2021-07-01
  • 2021-07-18
  • 2021-05-22
  • 2022-12-23
  • 2022-12-23
  • 2021-05-26
猜你喜欢
  • 2022-03-01
  • 2021-12-19
  • 2022-02-03
  • 2021-09-06
  • 2021-09-10
  • 2021-07-23
  • 2021-10-13
相关资源
相似解决方案