public void AddChapter(string chapterName, string address)
        {
            NovelChapter nc = new NovelChapter(chapterName);

            nc.ChapterAddress = address;
            this.novelChapters.Add(nc);
        }
        /// <summary>
        /// 从网站中获取指定章节的内容,返回章节内容的字节
        /// </summary>
        /// <param name="needDownloadChapter"></param>
        /// <param name="request"></param>
        /// <param name="response"></param>
        /// <returns></returns>
        private string GetResponseStringFromServer(NovelChapter needDownloadChapter, HttpWebRequest request, HttpWebResponse response)
        {
            Stream       dataStream         = null;
            StreamReader reader             = null;
            string       responseFromServer = "";

            for (int loop = 0; loop < this.repeatCount; loop++)
            {
                try
                {
                    request             = (HttpWebRequest)HttpWebRequest.Create(needDownloadChapter.ChapterAddress);
                    request.Credentials = CredentialCache.DefaultCredentials;

                    request.Timeout    = 60000;
                    response           = (HttpWebResponse)request.GetResponse();
                    request.KeepAlive  = false;
                    dataStream         = response.GetResponseStream();
                    reader             = new StreamReader(dataStream, Encoding.Default);
                    responseFromServer = reader.ReadToEnd();
                    if (responseFromServer == "")
                    {
                        continue;
                    }
                    if (regHtmlEnd.Match(responseFromServer).Success)
                    {
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                catch
                {
                    responseFromServer = "";
                    Thread.Sleep(1000);
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                    if (dataStream != null)
                    {
                        dataStream.Close();
                    }
                    if (response != null)
                    {
                        response.Close();
                    }
                    if (request != null)
                    {
                        request.Abort();
                    }
                }
            }
            return(responseFromServer);
        }
 /// <summary>
 /// 改变章节的获取状态
 /// </summary>
 /// <param name="nc"></param>
 /// <param name="cs"></param>
 private void ChangeGetState(NovelChapter nc, ChapterState cs)
 {
     lock (this.thisLock)
     {
         nc.ChapterState = cs;
     }
     this.TellNovelDirectoryListUpdated(this);
 }
        private void SaveResponseString(string handledString, NovelChapter nc, int fileIndex)
        {
            FileStream   fs = System.IO.File.Create(this.novel.LocalFolder + "\\" + GenerateSaveFileName(fileIndex));
            StreamWriter sw = new StreamWriter(fs);

            sw.Write(handledString);
            sw.Flush();
            sw.Close();
            fs.Close();
            nc.FileName = GenerateSaveFileName(fileIndex);
            this.ChangeGetState(nc, ChapterState.完成);
        }
        /// <summary>
        /// 获取要下载的章节对象
        /// </summary>
        /// <returns></returns>
        private NovelChapter GetNeedDownloadChapter(ref int fileIndex)
        {
            NovelChapter needDownloadChapter = null;

            lock (this.thisLock)
            {
                for (int i = 0; i < this.novel.NovelChapters.Count; i++)
                {
                    if (this.novel.NovelChapters[i].ChapterState == ChapterState.等待中)
                    {
                        fileIndex           = i;
                        needDownloadChapter = this.novel.NovelChapters[i];
                        needDownloadChapter.ChapterState = ChapterState.获取中;
                        break;
                    }
                }
            }
            this.TellNovelDirectoryListUpdated(this);

            return(needDownloadChapter);
        }
        /// <summary>
        /// 获取章节内容线线程调用
        /// </summary>
        private void GetContentDelegate()
        {
            HttpWebRequest  request   = null;
            HttpWebResponse response  = null;
            int             fileIndex = 0;

            //获取要下载的章节对象
            NovelChapter needDownloadChapter = this.GetNeedDownloadChapter(ref fileIndex);

            while (needDownloadChapter != null)
            {
                //开始下载html文件任务
                string responseFromServer = null;
                //获取指定章节页的网页源码
                responseFromServer = this.GetResponseStringFromServer(needDownloadChapter, request, response);


                if (responseFromServer == null || responseFromServer == "")
                {
                    this.ChangeGetState(needDownloadChapter, ChapterState.获取失败);
                }
                else
                {
                    //对获取的网页源码作预处理
                    string preHandleString = this.PreHandleResponseString(responseFromServer);
                    if (preHandleString == "")
                    {
                        this.ChangeGetState(needDownloadChapter, ChapterState.获取失败);
                    }
                    else
                    {
                        int index = preHandleString.IndexOf("<img");
                        if (index > 0)
                        {
                            this.DownloadAllChapterImg(needDownloadChapter, preHandleString, fileIndex);
                        }
                        else
                        {
                            this.SaveResponseString(this.LastHandleResponseString(preHandleString), needDownloadChapter, fileIndex);
                        }
                    }
                }

                Thread.Sleep(500);


                //判断是否要退出当前线程
                string threadName = Thread.CurrentThread.Name;
                Trace.Write(threadName);
                Trace.Write(threadName.Substring(16, threadName.Length - 16));
                if (threadName.StartsWith("GetContentThread"))
                {
                    if (int.Parse(threadName.Substring(16, threadName.Length - 16)) > this.threadCount - 1)
                    {
                        break;
                    }
                }

                if (this.isStopDownload)
                {
                    break;
                }

                //如果当前活动线程数量大于已改变线程数量,则当前线程退出
                if (this.activatedThreadCount > this.threadCount)
                {
                    break;
                }

                //继续下一个章节下载
                needDownloadChapter = this.GetNeedDownloadChapter(ref fileIndex);
            }
            lock (this.thisLock2)
            {
                this.activatedThreadCount--;

                if (this.activatedThreadCount == 0)
                {
                    this.TellHasAllThreadStopped(this);
                }
            }
        }
        /// <summary>
        /// 从网页内容中取出章节图片地址并下载
        /// </summary>
        /// <param name="nc"></param>
        /// <param name="contentString"></param>
        private void DownloadAllChapterImg(NovelChapter nc, string contentString, int fileIndex)
        {
            Uri       uri       = new Uri(nc.ChapterAddress);
            WebClient webclient = new WebClient();

            webclient.Credentials = CredentialCache.DefaultCredentials;

            string[] temp         = contentString.Split(new string[] { "<img src=\"" }, StringSplitOptions.RemoveEmptyEntries);
            string   imgFilesName = "";
            //当前文件的名称(带后缀)
            string filenamewithExt = "";
            string imgPath;
            bool   downloadSuccess = false;

            for (int j = 0; j < temp.Length; j++)
            {
                imgPath         = "";
                filenamewithExt = "";
                int index3 = temp[j].IndexOf('"');
                if (index3 < 5)
                {
                    continue;
                }
                string str = temp[j].Substring(0, index3);
                if (str.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) || str.EndsWith(".gif", StringComparison.OrdinalIgnoreCase))
                {
                    if (str.ToLower().StartsWith("http://"))
                    {
                        imgPath = str;
                    }
                    else if (str.StartsWith("/"))
                    {
                        imgPath = "http://" + uri.Host + str;
                    }
                    else
                    {
                        imgPath = nc.ChapterAddress.Substring(0, nc.ChapterAddress.LastIndexOf("/")) + "/" + str;
                    }
                    filenamewithExt = fileIndex.ToString() + "_" + j.ToString() + imgPath.Substring(imgPath.Length - 4, 4);
                    for (int loop = 0; loop < this.repeatCount; loop++)
                    {
                        try
                        {
                            webclient.DownloadFile(imgPath, this.novel.LocalFolder + "\\" + filenamewithExt);
                            downloadSuccess = true;
                            break;
                        }
                        catch
                        { Thread.Sleep(1000); }
                        finally
                        { }
                        if (loop == 4)
                        {
                            downloadSuccess = false;
                        }
                    }
                    if (imgFilesName == "")
                    {
                        imgFilesName = filenamewithExt;
                    }
                    else
                    {
                        imgFilesName = imgFilesName + "|" + filenamewithExt;
                    }
                    //如果其中一张图片下载失败,停止下载该章的其它图片
                    if (downloadSuccess == false)
                    {
                        break;
                    }
                }
            }
            webclient.Dispose();

            if (downloadSuccess)
            {
                nc.FileName = imgFilesName;
                this.ChangeGetState(nc, ChapterState.完成);
            }
            else
            {
                this.ChangeGetState(nc, ChapterState.获取失败);
            }
        }