<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_梦-开始的地方</title><subtitle type="text">Frederick</subtitle><id>http://feed.cnblogs.com/blog/u/15086/rss</id><updated>2010-11-21T12:57:47Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/15086/rss"/><entry><id>http://www.cnblogs.com/frederick-liu/archive/2010/11/21/1883465.html</id><title type="text">C#多线程网页采集器(Spider)</title><summary type="text">这是一个C#语言编写的多线程网页自动采集程序。下面展示了主要类的代码。完整代码请点此下载。</summary><published>2010-11-21T12:56:00Z</published><updated>2010-11-21T12:56:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2010/11/21/1883465.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2010/11/21/1883465.html"/><content type="html">&lt;p&gt;这是一个C#语言编写的多线程网页自动采集程序。下面展示了主要类的代码。完整代码请点此&lt;a href="http://programmingcanruinyourlife.themz.cn/spider.rar"&gt;下载&lt;/a&gt;。/**&lt;br/&gt;软件工程过程实践:&lt;br/&gt;--------------------------------------------&lt;br/&gt;用例-&amp;gt;数据模型-&amp;gt;描述系统功能的接口-&amp;gt;实际编码-&amp;gt;测试-&amp;gt;交付&lt;br/&gt;文字  逻辑设计   顺序图(通讯图)                     定制&lt;br/&gt;图    sql实现    类图(接口方法)                     配置&lt;br/&gt;      c#实现&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;用例UC1: 网页采集&lt;br/&gt;----------------------------------------------&lt;br/&gt;范围: WSE应用&lt;br/&gt;级别: 用户目标&lt;br/&gt;主要参与者: 采集员&lt;br/&gt;涉众及其关注点:&lt;br/&gt;  ——采集员: 希望能够增加,删除监控URL,启动,停止监控URL,指定监控类型,查看监控URL的列表&lt;br/&gt;  ——站长: 希望采集活动不要影响正常用户访问&lt;br/&gt;前置条件: 采集员必须经过确认和认证&lt;br/&gt;成功保证(或后置条件): 存储采集数据,确保没有重复的URL&lt;br/&gt;主成功场景(或基本流程):&lt;br/&gt;  1. 采集员增加新的监控URL,设定采集方式(本页,历遍本页,历遍网站),设定采集速度&lt;br/&gt;  2. 采集员启动采集&lt;br/&gt;  3. 采集员停止采集(如果有必要)&lt;br/&gt;  4. 采集员删除某监控URL(如果有必要)&lt;br/&gt;  5. 采集员浏览监控URL列表(如果有必要)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;PageInfo数据模型&lt;br/&gt;----------------------------&lt;br/&gt;标识符        | id&lt;br/&gt;创建时间      | createdTime&lt;br/&gt;修改时间      | modifiedTime&lt;br/&gt;创建人        | createdUser&lt;br/&gt;修改人        | modifiedUser&lt;br/&gt;              |&lt;br/&gt;网址          | URL&lt;br/&gt;网址128位MD5  | UrlMD5&lt;br/&gt;IP地址        | IP&lt;br/&gt;采集内容      | content&lt;br/&gt;页面类型      | type&lt;br/&gt;              |&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;采集流程图&lt;br/&gt;-------------------------------&lt;br/&gt;&lt;br/&gt; 初始化:载入已经采集的UrlMD5&lt;br/&gt;|-------------------------------------------------------------------------------------------------------|&lt;br/&gt;|Spider类                                                                                               |&lt;br/&gt;|         |---------------------------------------------------------------------|    |----------------| |&lt;br/&gt;|  |--|   |采集通道(线程)                         ------------------------------|---&amp;gt;| 已采集UrlMD5池 | |&lt;br/&gt;|  |种|   |      |---------|    |--------|    |---|------|     |--------|       |    |----------------| |&lt;br/&gt;|  |子|---|---|-&amp;gt;| URL队列 |---&amp;gt;| 采集器 |---&amp;gt;|   |  |   |----&amp;gt;| 分析器 |---|   |                       |&lt;br/&gt;|  |队|   |   |  |---------|    |--------|    |------|---|     |--------|   |   |                       |&lt;br/&gt;|  |列|   |   |                                      |                      |   |                       |&lt;br/&gt;|  |--|   |   |--------------------------------------|----------------------|   |    |----------------| |&lt;br/&gt;|    |---&amp;lt;|                                          ---------------------------|---&amp;gt;| 已采集内容队列 | |&lt;br/&gt;|    |    |---------------------------------------------------------------------|    |--------|-------| |&lt;br/&gt;|    |                                                                                        |         |&lt;br/&gt;|    |    |---------|                                                                         |         |&lt;br/&gt;|    |---&amp;lt;|存储线程 |&amp;lt;------------------------------------------------------------------------|         |&lt;br/&gt;|    |    |---------|                                                                                   |&lt;br/&gt;|    |                                                                                                  |&lt;br/&gt;|    |    |---------|                                                                                   |&lt;br/&gt;|    |---&amp;gt;|日志线程 |                                                                                   |&lt;br/&gt;|         |---------|                                                                                   |&lt;br/&gt;|                                                                                                       |&lt;br/&gt;|-------------------------------------------------------------------------------------------------------|&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;类设计&lt;br/&gt;-------------------------------&lt;br/&gt;控制器类&lt;br/&gt;  SpiderHandler -- 控制台入口&lt;br/&gt;&lt;br/&gt;采集核心类&lt;br/&gt;  Spider     核心&lt;br/&gt;  PageInfo   基础--数据结构&lt;br/&gt;  Gatherer   基础--网页采集器&lt;br/&gt;  Analyser   基础--url分析器&lt;br/&gt;&lt;br/&gt;外部接口&lt;br/&gt;  IStorage   数据存储接口&lt;br/&gt;  ISpiderUI  用户界面&lt;br/&gt;  ILogger    日志接口&lt;br/&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;*/&lt;br/&gt;&lt;br/&gt;//==================================================================&lt;br/&gt;//&lt;br/&gt;//    该软件是一个由C#编写的基于控制台的多线程网页自动采集程序。&lt;br/&gt;//    又称之为蜘蛛,机器人,爬行器等。&lt;br/&gt;//&lt;br/&gt;//    Copyright(C) 2009 themz.cn All rights reserved&lt;br/&gt;//    author:   xml&lt;br/&gt;//    email:    191081370@qq.com&lt;br/&gt;//    blog:     http://programmingcanruinyourlife.themz.cn/&lt;br/&gt;//    since:    .net2.0&lt;br/&gt;//    version:  1.0&lt;br/&gt;//    created:  2009-08-06&lt;br/&gt;//    modified: 2009-10-10&lt;br/&gt;//&lt;br/&gt;//  版权与免责声明：本软件所有权归原作者,用户可自由免费使用于任何非商业环境。&lt;br/&gt;//                  如果转载本文代码请不要删除这段版权声明。&lt;br/&gt;//                  如果由于使用本软件而造成自己或他人的任何损失,均与本软件作者无关。&lt;br/&gt;//                  特此声明!&lt;br/&gt;//&lt;br/&gt;//==================================================================&lt;br/&gt;//    简单使用帮助:&lt;br/&gt;//         1. 将下面代码保存到一个.cs后缀的文件中&lt;br/&gt;//         2. 用.net2.0的编译环境编译成一个exe文件后,双击打开&lt;br/&gt;//         3. 用 addSeeds命令添加采集种子, 例如: addSeeds http://url/&lt;br/&gt;//         4. 用 start 命令开始采集&lt;br/&gt;//         5. 反复使用 getContents 命令查看已采集到的内容&lt;br/&gt;//         6. pause 命令可暂停采集, start 命令继续&lt;br/&gt;//         7. stop 命令停止采集&lt;br/&gt;//         8. exit 命令退出本软件&lt;br/&gt;//&lt;br/&gt;//&lt;br/&gt;&lt;br/&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Data;&lt;br/&gt;using System.Data.Common;&lt;br/&gt;using System.IO;&lt;br/&gt;using System.Net;&lt;br/&gt;using System.Text;&lt;br/&gt;using System.Text.RegularExpressions;&lt;br/&gt;using System.Threading;&lt;br/&gt;&lt;br/&gt;//using System.Configuration;&lt;br/&gt;//using System.Diagnostics;&lt;br/&gt;//[Serializable()]&lt;br/&gt;namespace My.WSE.Spider&lt;br/&gt;{&lt;br/&gt;  #region 线程模式接口&lt;br/&gt;    /**&lt;br/&gt;    线程类模式&lt;br/&gt;&lt;br/&gt;    接口  参数&lt;br/&gt;&lt;br/&gt;    队列  属性&lt;br/&gt;    线程  属性&lt;br/&gt;&lt;br/&gt;    入队  方法&lt;br/&gt;    出队  方法&lt;br/&gt;&lt;br/&gt;    增加/启动  方法&lt;br/&gt;    暂停       方法&lt;br/&gt;    停止       方法&lt;br/&gt;    */&lt;br/&gt;    public interface IThread&lt;br/&gt;    {&lt;br/&gt;        //T Queue{ get; }&lt;br/&gt;        //List&amp;lt;Thread&amp;gt; Threads{ get; }&lt;br/&gt;        //&lt;br/&gt;        //void Enqueue( T t );&lt;br/&gt;        //T Dequeue();&lt;br/&gt;&lt;br/&gt;        Thread AddThread();&lt;br/&gt;        void RemoveThread();&lt;br/&gt;        void RequestThreadPause();&lt;br/&gt;        void RequestThreadPause( bool pauseOrContinue );&lt;br/&gt;        void RequestThreadStop();&lt;br/&gt;    }&lt;br/&gt;  #endregion&lt;br/&gt;&lt;br/&gt;  #region  外部接口&lt;br/&gt;    // 采集接口&lt;br/&gt;    public interface IGatherer&lt;br/&gt;    {&lt;br/&gt;        void Download( ref PageInfo info,string contentType,int timeout );&lt;br/&gt;        void Download( ref PageInfo info,int timeout );&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    // 存储接口&lt;br/&gt;    public interface IStorage&lt;br/&gt;    {&lt;br/&gt;        List&amp;lt;string&amp;gt; GetIndexeds();                      //取得所有已下载的URL的MD5值&lt;br/&gt;&lt;br/&gt;        List&amp;lt;SeedInfo&amp;gt; GetSeeds();&lt;br/&gt;        int AddSeed( SeedInfo info );&lt;br/&gt;        void RemoveSeed( SeedInfo info );&lt;br/&gt;&lt;br/&gt;        void SaveContents( List&amp;lt;PageInfo&amp;gt; info );        //保存采集到的内容&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    // 日志接口&lt;br/&gt;    public interface ILogger&lt;br/&gt;    {&lt;br/&gt;        void Write( string content );&lt;br/&gt;        string Read( string filename );&lt;br/&gt;&lt;br/&gt;        string ToString( Exception ex );&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;  #endregion&lt;br/&gt;&lt;br/&gt;  #region 异常类&lt;br/&gt;    public class ContentTypeException : Exception&lt;br/&gt;    {&lt;br/&gt;        public ContentTypeException( string message ) : base( message ){}&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    public class ContentSizeException : Exception&lt;br/&gt;    {&lt;br/&gt;        public ContentSizeException( string message ) : base( message ){}&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    public class NotOnlyException : Exception&lt;br/&gt;    {&lt;br/&gt;        public NotOnlyException( string message ) : base( message ){}&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    public class KeyHasExistsException : Exception&lt;br/&gt;    {&lt;br/&gt;        public KeyHasExistsException( string message ) : base( message ){}&lt;br/&gt;    }&lt;br/&gt;  #endregion&lt;br/&gt;&lt;br/&gt;  #region PageInfo队列&lt;br/&gt;    public class PageQueue&lt;br/&gt;    {&lt;br/&gt;        // 构造函数1&lt;br/&gt;        public PageQueue()&lt;br/&gt;        {&lt;br/&gt;            _queue = new LinkedList&amp;lt;string&amp;gt;();&lt;br/&gt;        }&lt;br/&gt;        // 构造函数2&lt;br/&gt;        public PageQueue( ref LinkedList&amp;lt;string&amp;gt; queue ) : this()&lt;br/&gt;        {&lt;br/&gt;            if( null != queue ){&lt;br/&gt;                _queue = queue;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;      #region 队列方法&lt;br/&gt;        public int Count&lt;br/&gt;        {&lt;br/&gt;            get{  return _queue.Count;  }&lt;br/&gt;        }&lt;br/&gt;        public bool Contains( PageInfo info )&lt;br/&gt;        {&lt;br/&gt;            return _queue.Contains( info.UrlMD5 );&lt;br/&gt;        }&lt;br/&gt;        public void Enqueue( PageInfo info )   //等同于AddLast&lt;br/&gt;        {&lt;br/&gt;            AddLast( info );&lt;br/&gt;        }&lt;br/&gt;        public PageInfo Dequeue()              //等同于RemoveFirst&lt;br/&gt;        {&lt;br/&gt;            return RemoveFirst();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public void AddFirst( PageInfo info )&lt;br/&gt;        {&lt;br/&gt;            lock( _queue ){&lt;br/&gt;                _queue.AddFirst( info.UrlMD5 );&lt;br/&gt;                AddData( info );&lt;br/&gt;                Monitor.Pulse( _queue );&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public void AddLast( PageInfo info )&lt;br/&gt;        {&lt;br/&gt;            lock( _queue ){&lt;br/&gt;                _queue.AddLast( info.UrlMD5 );&lt;br/&gt;                AddData( info );&lt;br/&gt;                Monitor.Pulse( _queue );&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public PageInfo RemoveFirst()&lt;br/&gt;        {&lt;br/&gt;            PageInfo info = null;&lt;br/&gt;            lock( _queue ){&lt;br/&gt;                LinkedListNode&amp;lt;string&amp;gt; node = _queue.First;&lt;br/&gt;                if( null == node ){&lt;br/&gt;                    Monitor.Wait( _queue );&lt;br/&gt;                    node = _queue.First;&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                string key = node.Value;&lt;br/&gt;                _queue.RemoveFirst();&lt;br/&gt;                info = GetData(key);&lt;br/&gt;                RemoveData(key);    // 释放内存中的数据&lt;br/&gt;            }&lt;br/&gt;            return info;&lt;br/&gt;        }&lt;br/&gt;        public PageInfo RemoveLast()&lt;br/&gt;        {&lt;br/&gt;            PageInfo info = null;&lt;br/&gt;            lock( _queue ){&lt;br/&gt;                LinkedListNode&amp;lt;string&amp;gt; node = _queue.First;&lt;br/&gt;                if( null == node ){&lt;br/&gt;                    Monitor.Wait( _queue );&lt;br/&gt;                }&lt;br/&gt;                else{&lt;br/&gt;                    string key = node.Value;&lt;br/&gt;                    _queue.RemoveFirst();&lt;br/&gt;                    info = GetData(key);&lt;br/&gt;                    RemoveData(key);    // 释放内存中的数据&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            return info;&lt;br/&gt;        }&lt;br/&gt;        public PageInfo Remove( PageInfo info )&lt;br/&gt;        {&lt;br/&gt;            lock( _queue ){&lt;br/&gt;                if( _queue.Remove(info.UrlMD5) ){&lt;br/&gt;                    info = GetData(info.UrlMD5);&lt;br/&gt;                    RemoveData(info.UrlMD5);    // 释放内存中的数据&lt;br/&gt;                }&lt;br/&gt;                else{&lt;br/&gt;                    info = null;&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            return info;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public Dictionary&amp;lt;string,PageInfo&amp;gt; ToDictionary()&lt;br/&gt;        {&lt;br/&gt;            Dictionary&amp;lt;string,PageInfo&amp;gt; dict = new Dictionary&amp;lt;string,PageInfo&amp;gt;();&lt;br/&gt;&lt;br/&gt;            lock( _queue ){&lt;br/&gt;                LinkedListNode&amp;lt;string&amp;gt; node = _queue.First;&lt;br/&gt;                while( null != node ){&lt;br/&gt;                    dict[node.Value] = GetData(node.Value);&lt;br/&gt;                    node = node.Next;&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            return dict;&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region 词典方法&lt;br/&gt;        public PageInfo GetData( string key )&lt;br/&gt;        {&lt;br/&gt;            lock( _s_pages ){&lt;br/&gt;                if( _s_pages.ContainsKey(key) ){&lt;br/&gt;                    return _s_pages[key];&lt;br/&gt;                }else{&lt;br/&gt;                    _log.Enqueue( string.Format( "wse.spider.cs GetData,Dictionary键{0}没有找到",key) );&lt;br/&gt;                    return null;&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public void AddData( PageInfo info )&lt;br/&gt;        {&lt;br/&gt;            lock( _s_pages ){&lt;br/&gt;                _s_pages[info.UrlMD5] = info;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public void RemoveData( string key )&lt;br/&gt;        {&lt;br/&gt;            lock( _s_pages ){&lt;br/&gt;                if( _s_pages.ContainsKey(key) ){&lt;br/&gt;                    _s_pages.Remove(key);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public bool ContainsData( PageInfo info )&lt;br/&gt;        {&lt;br/&gt;            return _s_pages.ContainsKey(info.UrlMD5);&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Private Members&lt;br/&gt;&lt;br/&gt;        private LinkedList&amp;lt;string&amp;gt; _queue = null;&lt;br/&gt;        private static Dictionary&amp;lt;string,PageInfo&amp;gt; _s_pages = new Dictionary&amp;lt;string,PageInfo&amp;gt;();&lt;br/&gt;&lt;br/&gt;        private EventLogger _log = new EventLogger();&lt;br/&gt;      #endregion&lt;br/&gt;    }&lt;br/&gt;  #endregion&lt;br/&gt;&lt;br/&gt;  #region 采集线程类&lt;br/&gt;    public class PageGatherer : IThread&lt;br/&gt;    {&lt;br/&gt;      #region 构造函数&lt;br/&gt;        // 构造函数1&lt;br/&gt;        public PageGatherer(){}&lt;br/&gt;&lt;br/&gt;        // 构造函数2&lt;br/&gt;        public PageGatherer( IGatherer gather )&lt;br/&gt;        {&lt;br/&gt;            _log = new EventLogger();&lt;br/&gt;            _store = new PageStorage();&lt;br/&gt;&lt;br/&gt;            _gather = gather;&lt;br/&gt;            _queue = new PageQueue();        // 每个队列可以&lt;br/&gt;            _threads = new List&amp;lt;Thread&amp;gt;();   // 有多个线程&lt;br/&gt;&lt;br/&gt;            _shouldPause = new ManualResetEvent(true);&lt;br/&gt;            _shouldStop = false;&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Public Property&lt;br/&gt;        // 静态成员公开&lt;br/&gt;        public Dictionary&amp;lt;string,string&amp;gt; IndexedPool&lt;br/&gt;        {&lt;br/&gt;            get{ return _s_indexedPool; }&lt;br/&gt;        }&lt;br/&gt;        public PageQueue SeedQueue&lt;br/&gt;        {&lt;br/&gt;            get{  return _s_seedQueue;  }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        // 当前采集队列&lt;br/&gt;        public PageQueue Queue&lt;br/&gt;        {&lt;br/&gt;            get{  return _queue;  }&lt;br/&gt;        }&lt;br/&gt;        public List&amp;lt;Thread&amp;gt; Threads&lt;br/&gt;        {&lt;br/&gt;            get{  return _threads;  }&lt;br/&gt;        }&lt;br/&gt;        // 线程总数&lt;br/&gt;        public int ThreadCount&lt;br/&gt;        {&lt;br/&gt;            get{  return _threadCount;  }&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region 线程方法(Thread Method)&lt;br/&gt;        // 增加线程&lt;br/&gt;        public Thread AddThread()&lt;br/&gt;        {&lt;br/&gt;            Thread t = new Thread( new ThreadStart(ThreadRun) );&lt;br/&gt;            t.IsBackground = true;&lt;br/&gt;            t.Start();&lt;br/&gt;            _threads.Add(t);&lt;br/&gt;            _threadCount++;&lt;br/&gt;            return t;&lt;br/&gt;        }&lt;br/&gt;        // 减少线程&lt;br/&gt;        public void RemoveThread()&lt;br/&gt;        {&lt;br/&gt;            // 尚未实现&lt;br/&gt;        }&lt;br/&gt;        // 请求线程暂停&lt;br/&gt;        public void RequestThreadPause()&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;        // 请求线程继续&lt;br/&gt;        public void RequestThreadPause( bool pauseOrContinue )&lt;br/&gt;        {&lt;br/&gt;            if( !pauseOrContinue ){&lt;br/&gt;                _shouldPause.Set();&lt;br/&gt;            }else{&lt;br/&gt;                _shouldPause.Reset();&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        // 请求线程停止&lt;br/&gt;        public void RequestThreadStop()&lt;br/&gt;        {&lt;br/&gt;            _shouldStop = true;&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Private Methods&lt;br/&gt;        // 采集线程方法&lt;br/&gt;        private void ThreadRun()&lt;br/&gt;        {&lt;br/&gt;            PageInfo info = null;&lt;br/&gt;&lt;br/&gt;            // 循环: URL-&amp;gt;下载-&amp;gt;存储-&amp;gt;分析-&amp;gt;|URL-&amp;gt;下载....&lt;br/&gt;            while( !_shouldStop )&lt;br/&gt;            {&lt;br/&gt;                _shouldPause.WaitOne();              // 是否暂停&lt;br/&gt;                if( _queue.Count &amp;lt; 1 ){&lt;br/&gt;                    _queue.Enqueue( _s_seedQueue.Dequeue() );     // 自动取得种子&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                info = _queue.Dequeue();&lt;br/&gt;                if( null == info ){  continue;  }&lt;br/&gt;&lt;br/&gt;                //1 下载&lt;br/&gt;                string url = info.URL;&lt;br/&gt;                try{&lt;br/&gt;                    _gather.Download(ref info,"text/html",90000);&lt;br/&gt;                }&lt;br/&gt;                catch( Exception ex ){&lt;br/&gt;                    _log.Enqueue( info.URL + " " + ex.ToString() );&lt;br/&gt;                    continue;&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                //2 把当前url加入_s_indexedPool&lt;br/&gt;                AddIndexed( info.UrlMD5 );&lt;br/&gt;&lt;br/&gt;                //3 保存:加入_dataPool&lt;br/&gt;                _store.Queue.Enqueue( info );&lt;br/&gt;&lt;br/&gt;                //4 分析:加入下载队列queue&lt;br/&gt;                AnalyzeToQueue( info, ref _queue );&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        // 分析出页面中的url,并把它们加进队列中&lt;br/&gt;        private void AnalyzeToQueue( PageInfo info, ref PageQueue queue )&lt;br/&gt;        {&lt;br/&gt;            PageQueue _queue = queue;&lt;br/&gt;&lt;br/&gt;            List&amp;lt;string[]&amp;gt; urls = Analyzer.ParseToURLs(info);&lt;br/&gt;            PageInfo newInfo = null;&lt;br/&gt;&lt;br/&gt;            for( int i=0,len=urls.Count; i&amp;lt;len; i++ ){&lt;br/&gt;                newInfo = new PageInfo( urls[i][0],info.SeedID );&lt;br/&gt;&lt;br/&gt;                if( !_queue.ContainsData(newInfo) &amp;amp;&amp;amp; !_s_indexedPool.ContainsKey(newInfo.UrlMD5) ){&lt;br/&gt;                    newInfo.Title = urls[i][1];&lt;br/&gt;                    newInfo.Referer = info.URL;&lt;br/&gt;&lt;br/&gt;                    _queue.Enqueue( newInfo );&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        // 加入已采集队列&lt;br/&gt;        private void AddIndexed( string urlMD5 )&lt;br/&gt;        {&lt;br/&gt;            lock( _s_indexedPool ){&lt;br/&gt;                if( !_s_indexedPool.ContainsKey(urlMD5) ){&lt;br/&gt;                    _s_indexedPool.Add( urlMD5, null );&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Private Members&lt;br/&gt;        private EventLogger _log = null;&lt;br/&gt;        private PageStorage  _store = null;&lt;br/&gt;&lt;br/&gt;        private IGatherer _gather = null;       // 接口&lt;br/&gt;        private PageQueue _queue;               // 每个队列可以&lt;br/&gt;        private List&amp;lt;Thread&amp;gt; _threads;          // 有多个线程&lt;br/&gt;&lt;br/&gt;        private ManualResetEvent _shouldPause;  // 暂停&lt;br/&gt;        private bool _shouldStop;               // 停止&lt;br/&gt;&lt;br/&gt;        private static Dictionary&amp;lt;string,string&amp;gt; _s_indexedPool = new Dictionary&amp;lt;string,string&amp;gt;();      // 已采集的URL&lt;br/&gt;        private static PageQueue _s_seedQueue = new PageQueue();   // 种子队列&lt;br/&gt;&lt;br/&gt;        private static int _threadCount = 0;     // 运行的线程的总数&lt;br/&gt;      #endregion&lt;br/&gt;    }&lt;br/&gt;  #endregion&lt;br/&gt;&lt;br/&gt;  #region 存储线程类&lt;br/&gt;    public class PageStorage  : IThread&lt;br/&gt;    {&lt;br/&gt;      #region 构造函数&lt;br/&gt;        // 构造函数1&lt;br/&gt;        public PageStorage(){}&lt;br/&gt;&lt;br/&gt;        // 构造函数2&lt;br/&gt;        public PageStorage( IStorage store )&lt;br/&gt;        {&lt;br/&gt;            _log = new EventLogger();&lt;br/&gt;&lt;br/&gt;            _store = store;&lt;br/&gt;            _shouldStop = false;&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Public Property&lt;br/&gt;        // 对列对象&lt;br/&gt;        public PageQueue Queue&lt;br/&gt;        {&lt;br/&gt;            get{ return _s_queue;  }&lt;br/&gt;        }&lt;br/&gt;        // 线程对象集合&lt;br/&gt;        public List&amp;lt;Thread&amp;gt; Threads&lt;br/&gt;        {&lt;br/&gt;            get{ return _threads;  }&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region 线程方法(Thread Method)&lt;br/&gt;        // 增加线程&lt;br/&gt;        public Thread AddThread()&lt;br/&gt;        {&lt;br/&gt;            Thread t = new Thread( new ThreadStart(ThreadRun) );&lt;br/&gt;            t.IsBackground = true;&lt;br/&gt;            t.Start();&lt;br/&gt;            return t;&lt;br/&gt;        }&lt;br/&gt;        // 减少线程&lt;br/&gt;        public void RemoveThread()&lt;br/&gt;        {&lt;br/&gt;            // 尚未实现&lt;br/&gt;        }&lt;br/&gt;        // 请求线程暂停&lt;br/&gt;        public void RequestThreadPause()&lt;br/&gt;        {&lt;br/&gt;            // 尚未实现&lt;br/&gt;        }&lt;br/&gt;        // 请求线程继续&lt;br/&gt;        public void RequestThreadPause( bool pauseOrContinue )&lt;br/&gt;        {&lt;br/&gt;            // 尚未实现&lt;br/&gt;        }&lt;br/&gt;        // 请求线程停止&lt;br/&gt;        public void RequestThreadStop()&lt;br/&gt;        {&lt;br/&gt;            _shouldStop = true;&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Private Methods&lt;br/&gt;        // 线程方法&lt;br/&gt;        private void ThreadRun()&lt;br/&gt;        {&lt;br/&gt;            if( null == _store ){ return;  }&lt;br/&gt;&lt;br/&gt;            int count = 10;&lt;br/&gt;            List&amp;lt;PageInfo&amp;gt; infos = null;&lt;br/&gt;&lt;br/&gt;            while( !_shouldStop )&lt;br/&gt;            {&lt;br/&gt;                infos = DequeueSome( count );&lt;br/&gt;                try{&lt;br/&gt;                    _store.SaveContents( infos );&lt;br/&gt;                }&lt;br/&gt;                catch( Exception ex ){&lt;br/&gt;                    _log.Enqueue( ex.ToString() );&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        // 队列方法&lt;br/&gt;        private List&amp;lt;PageInfo&amp;gt; DequeueSome( int count )&lt;br/&gt;        {&lt;br/&gt;            List&amp;lt;PageInfo&amp;gt; infos = new List&amp;lt;PageInfo&amp;gt;();&lt;br/&gt;&lt;br/&gt;            for( int i=0; i&amp;lt;count; i++ )  // 按每10条记录一组进行存储&lt;br/&gt;            {&lt;br/&gt;                infos.Add( _s_queue.Dequeue() );&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            return infos;&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Private Members&lt;br/&gt;        private EventLogger _log;    //日志&lt;br/&gt;&lt;br/&gt;        private IStorage _store;                              //接口&lt;br/&gt;        private static PageQueue _s_queue = new PageQueue();  //队列&lt;br/&gt;        private List&amp;lt;Thread&amp;gt; _threads = new List&amp;lt;Thread&amp;gt;();   //线程&lt;br/&gt;&lt;br/&gt;        private bool _shouldStop;&lt;br/&gt;      #endregion&lt;br/&gt;    }&lt;br/&gt;  #endregion&lt;br/&gt;&lt;br/&gt;  #region 日志线程类&lt;br/&gt;    public class EventLogger : IThread&lt;br/&gt;    {&lt;br/&gt;        // 构造函数1&lt;br/&gt;        public EventLogger(){}&lt;br/&gt;&lt;br/&gt;        // 构造函数2&lt;br/&gt;        public EventLogger( ILogger logger )&lt;br/&gt;        {&lt;br/&gt;            _logger = logger;&lt;br/&gt;            _shouldStop = false;&lt;br/&gt;            _selfCheckInterval = 300000;    // 5分钟&lt;br/&gt;        }&lt;br/&gt;      #region Public Properties&lt;br/&gt;        public Queue&amp;lt;string&amp;gt; Queue&lt;br/&gt;        {&lt;br/&gt;            get{  return _s_queue;  }&lt;br/&gt;        }&lt;br/&gt;        public List&amp;lt;Thread&amp;gt; Threads&lt;br/&gt;        {&lt;br/&gt;            get{  return _threads;  }&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region 队列方法(Queue Method)&lt;br/&gt;        public void Enqueue( string s )&lt;br/&gt;        {&lt;br/&gt;            lock( _s_queue ){&lt;br/&gt;                _s_queue.Enqueue( s );&lt;br/&gt;                Monitor.Pulse( _s_queue );&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public string Dequeue()&lt;br/&gt;        {&lt;br/&gt;            lock( _s_queue )&lt;br/&gt;            {&lt;br/&gt;                if( 1 &amp;gt; _s_queue.Count ){&lt;br/&gt;                    Monitor.Wait( _s_queue );&lt;br/&gt;                }&lt;br/&gt;                return _s_queue.Dequeue();&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region 线程方法(Thread Method)&lt;br/&gt;        //&lt;br/&gt;        public Thread AddThread()&lt;br/&gt;        {&lt;br/&gt;            Thread t = new Thread( new ThreadStart(ThreadRun) );&lt;br/&gt;            t.IsBackground = true;&lt;br/&gt;            t.Start();&lt;br/&gt;            _threads.Add(t);&lt;br/&gt;            return t;&lt;br/&gt;        }&lt;br/&gt;        // 减少线程&lt;br/&gt;        public void RemoveThread()&lt;br/&gt;        {&lt;br/&gt;            // 尚未实现&lt;br/&gt;        }&lt;br/&gt;        // 请求线程暂停&lt;br/&gt;        public void RequestThreadPause()&lt;br/&gt;        {&lt;br/&gt;            // 尚未实现&lt;br/&gt;        }&lt;br/&gt;        // 请求线程继续&lt;br/&gt;        public void RequestThreadPause( bool pauseOrContinue )&lt;br/&gt;        {&lt;br/&gt;            // 尚未实现&lt;br/&gt;        }&lt;br/&gt;        // 请求线程停止&lt;br/&gt;        public void RequestThreadStop()&lt;br/&gt;        {&lt;br/&gt;            _shouldStop = true;&lt;br/&gt;        }&lt;br/&gt;        // 增加自检线程&lt;br/&gt;        public void AddSelfCheckThread()&lt;br/&gt;        {&lt;br/&gt;            if( false == _isSelfCheckRun ){&lt;br/&gt;                Thread t = new Thread( new ThreadStart(SelfCheck) );&lt;br/&gt;                t.IsBackground = true;&lt;br/&gt;                t.Start();&lt;br/&gt;                _isSelfCheckRun = true;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Private Methods&lt;br/&gt;        // 日志主线程函数&lt;br/&gt;        private void ThreadRun()&lt;br/&gt;        {&lt;br/&gt;            if( null == _logger ){ return;  }&lt;br/&gt;&lt;br/&gt;            while( !_shouldStop )&lt;br/&gt;            {&lt;br/&gt;                try{&lt;br/&gt;                    _logger.Write( Dequeue() );&lt;br/&gt;                }&lt;br/&gt;                catch( Exception ex ){&lt;br/&gt;                    Console.WriteLine( string.Format( "警告:日志写入发生错误{0}",ex.ToString() ) );&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        // 日志自检子线程函数&lt;br/&gt;        private void SelfCheck()&lt;br/&gt;        {&lt;br/&gt;            if( null == _logger ){ return;  }&lt;br/&gt;&lt;br/&gt;            while( !_shouldStop )&lt;br/&gt;            {&lt;br/&gt;                try{&lt;br/&gt;                    _logger.Write( "日志自检完成" );&lt;br/&gt;                    Thread.Sleep( _selfCheckInterval );&lt;br/&gt;                }&lt;br/&gt;                catch( Exception ex ){&lt;br/&gt;                    Console.WriteLine( string.Format( "警告:日志自检发生错误{0}",ex.ToString() ) );&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;      #endregion&lt;br/&gt;&lt;br/&gt;      #region Private Members&lt;br/&gt;        private ILogger _logger = null;                               // 接口&lt;br/&gt;        private static Queue&amp;lt;string&amp;gt; _s_queue = new Queue&amp;lt;string&amp;gt;();  // 一些标志性事件(异常或成功)&lt;br/&gt;        private List&amp;lt;Thread&amp;gt; _threads = new List&amp;lt;Thread&amp;gt;();           // 一个队列可以有多个线程&lt;br/&gt;&lt;br/&gt;        private bool _shouldStop;&lt;br/&gt;&lt;br/&gt;        private int _selfCheckInterval;   // 日志模块自检间隔&lt;br/&gt;        private static bool _isSelfCheckRun = false;&lt;br/&gt;      #endregion&lt;br/&gt;    }&lt;br/&gt;  #endregion&lt;br/&gt;&lt;br/&gt;} // end namespace My.WSE&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/frederick-liu/aggbug/1883465.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/frederick-liu/archive/2010/11/21/1883465.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2009/07/13/1522774.html</id><title type="text">代朋友招聘VB.NET开发人员（天津）</title><summary type="text">要求：1.2年以上的项目开发经验2.有大型项目开发经验。 3.熟悉.NET平台框架，精通VB.Net语言 4.熟悉面向对象的系统分析和设计 5.有良好的项目管理经验,能有效地管理开发流程和进度控制 6.熟悉各类软件开发文档的编写 7.会日语优先工作地点：天津有意者请联系 02283788288 李小姐</summary><published>2009-07-13T10:27:00Z</published><updated>2009-07-13T10:27:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2009/07/13/1522774.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2009/07/13/1522774.html"/><content type="text">要求：1.2年以上的项目开发经验2.有大型项目开发经验。 3.熟悉.NET平台框架，精通VB.Net语言 4.熟悉面向对象的系统分析和设计 5.有良好的项目管理经验,能有效地管理开发流程和进度控制 6.熟悉各类软件开发文档的编写 7.会日语优先工作地点：天津有意者请联系 02283788288 李小姐</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2006/04/09/370800.html</id><title type="text">博客园期刊2006年第三期</title><summary type="text">编者的话： 大家好：首先要向大家道歉，本期杂志的出版延期至了4月份，首先责任在我，因为本人近期比较忙，下半月又去上海出差，导致期刊延误，再次向大家道歉。 其次，本月只收到了Vitoria和yiyegufan两位编辑的投稿，在这里要向其他编辑提出批评，希望大家能踊跃投稿，期刊团队本身已经尽最大努力简单编辑人员的投稿工作量，希望大家能团建合作，共同建立好我们自己的网络杂志。------------...</summary><published>2006-04-09T13:14:00Z</published><updated>2006-04-09T13:14:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2006/04/09/370800.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2006/04/09/370800.html"/><content type="text">编者的话： 大家好：首先要向大家道歉，本期杂志的出版延期至了4月份，首先责任在我，因为本人近期比较忙，下半月又去上海出差，导致期刊延误，再次向大家道歉。 其次，本月只收到了Vitoria和yiyegufan两位编辑的投稿，在这里要向其他编辑提出批评，希望大家能踊跃投稿，期刊团队本身已经尽最大努力简单编辑人员的投稿工作量，希望大家能团建合作，共同建立好我们自己的网络杂志。------------...</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2006/03/20/353673.html</id><title type="text">3月份期刊延期通知</title><summary type="text">很抱歉通知大家一下，3月份的期刊因为本人最近工作非常忙，为了保证质量所以要延期几天，我相信大家宁愿看到高质量的期刊也不会喜欢赶工出来的作品。另外感谢听棠兄的SPL，确实使工作进度快了很多。</summary><published>2006-03-19T16:50:00Z</published><updated>2006-03-19T16:50:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2006/03/20/353673.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2006/03/20/353673.html"/><content type="text">很抱歉通知大家一下，3月份的期刊因为本人最近工作非常忙，为了保证质量所以要延期几天，我相信大家宁愿看到高质量的期刊也不会喜欢赶工出来的作品。另外感谢听棠兄的SPL，确实使工作进度快了很多。</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2006/02/21/334568.html</id><title type="text">博客园期刊团队2006年企划</title><summary type="text">2006年博客园期刊的发布会放在 http://magazine.cnblogs.com/index.aspx 中。同时在博客园首页公布。欢迎大家对期刊的工作提出宝贵的意见和建议（http://magazine.cnblogs.com/board.aspx?boardid=5） 同时也欢迎大家加入期刊团队 http://magazine.cnblogs.com/topic.aspx?topicid...</summary><published>2006-02-21T02:57:00Z</published><updated>2006-02-21T02:57:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2006/02/21/334568.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2006/02/21/334568.html"/><content type="text">2006年博客园期刊的发布会放在 http://magazine.cnblogs.com/index.aspx 中。同时在博客园首页公布。欢迎大家对期刊的工作提出宝贵的意见和建议（http://magazine.cnblogs.com/board.aspx?boardid=5） 同时也欢迎大家加入期刊团队 http://magazine.cnblogs.com/topic.aspx?topicid...</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2006/02/16/331855.html</id><title type="text">博客园电子期刊06年2月刊</title><summary type="text">下载地址：http://magazine.cnblogs.com/topic.aspx?topicid=1可能需要注册后才能下载，这个程序还没找到游客权限的地方，给大家带来不便，在此道歉了。</summary><published>2006-02-16T06:53:00Z</published><updated>2006-02-16T06:53:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2006/02/16/331855.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2006/02/16/331855.html"/><content type="text">下载地址：http://magazine.cnblogs.com/topic.aspx?topicid=1可能需要注册后才能下载，这个程序还没找到游客权限的地方，给大家带来不便，在此道歉了。</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2006/01/01/309483.html</id><title type="text">2006年1月第一期下载</title><summary type="text">2006年度博客圆期刊1月份第一期感谢：1. Frederick 2. 提示符 3. 维多利亚的飞翔 4. 米小波 5. shalala 6. 梵星 7. Toddy 8. 网管人生 9. xiaotao 10. 杨利 11. YS 12. didasoft 13. 萝卜皮 14. 烙饼 的辛勤工作（排名不分先后）下载地址(已经修正) ：http://magazine.cnblogs.com/up...</summary><published>2006-01-01T12:05:00Z</published><updated>2006-01-01T12:05:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2006/01/01/309483.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2006/01/01/309483.html"/><content type="text">2006年度博客圆期刊1月份第一期感谢：1. Frederick 2. 提示符 3. 维多利亚的飞翔 4. 米小波 5. shalala 6. 梵星 7. Toddy 8. 网管人生 9. xiaotao 10. 杨利 11. YS 12. didasoft 13. 萝卜皮 14. 烙饼 的辛勤工作（排名不分先后）下载地址(已经修正) ：http://magazine.cnblogs.com/up...</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2005/12/21/301307.html</id><title type="text">博客园电子期刊2005年12月第二期（总第三期）</title><summary type="text">下载地址：http://frederick-liu.cnblogs.com/Files/frederick-liu/博客园期刊第三期.rar感谢各位编辑的辛勤工作。</summary><published>2005-12-21T01:35:00Z</published><updated>2005-12-21T01:35:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2005/12/21/301307.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2005/12/21/301307.html"/><content type="text">下载地址：http://frederick-liu.cnblogs.com/Files/frederick-liu/博客园期刊第三期.rar感谢各位编辑的辛勤工作。</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2005/12/20/300591.html</id><title type="text">12月第二期杂志，内部预览</title><summary type="text">请大家提出建议。/Files/frederick-liu/博客园期刊第三期.rar</summary><published>2005-12-20T00:55:00Z</published><updated>2005-12-20T00:55:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2005/12/20/300591.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2005/12/20/300591.html"/><content type="text">请大家提出建议。/Files/frederick-liu/博客园期刊第三期.rar</content></entry><entry><id>http://www.cnblogs.com/frederick-liu/archive/2005/12/18/299671.html</id><title type="text">博客圆期刊12月第一期WEB在线阅读版</title><summary type="text">访问地址：http://magazine.cnblogs.com/mag/n20051201/index.html让我们感谢为此付出劳动的编辑们。12月第二期期刊预览[05-11-25]Windows Form 2.0 自动完成[Frederick].doc [05-11-25]模仿AppSettings进行web.config的自定义节读取[简单实用型][yiyegufan].doc [05-1...</summary><published>2005-12-18T11:48:00Z</published><updated>2005-12-18T11:48:00Z</updated><author><name>Frederick</name><uri>http://www.cnblogs.com/frederick-liu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/frederick-liu/archive/2005/12/18/299671.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/frederick-liu/archive/2005/12/18/299671.html"/><content type="text">访问地址：http://magazine.cnblogs.com/mag/n20051201/index.html让我们感谢为此付出劳动的编辑们。12月第二期期刊预览[05-11-25]Windows Form 2.0 自动完成[Frederick].doc [05-11-25]模仿AppSettings进行web.config的自定义节读取[简单实用型][yiyegufan].doc [05-1...</content></entry></feed>
