/// <summary>
        /// 设置采集情况记录的委托
        /// </summary>
        /// <param name="str"></param>
        delegate void SetNote(string str);
        private void SetTextNote(string strNote) 
        {  
           
            this.txtNode.Text = strNote;
            this.txtNode.SelectionStart = strNote.Length-1;
            this.txtNode.ScrollToCaret();
            System.Threading.Thread.Sleep(5);
           
        }        /// <summary>
        /// 设置源代码的委托
        /// </summary>
        /// <param name="str"></param>
        delegate void SetCode(string str);
        private void SetCodeText(string strCode)
        {
           
                this.txtCode.Text = strCode;
           
          
        }        /// <summary>
        /// 设置获取的新闻标题委托
        /// </summary>
        /// <param name="table"></param>
        delegate void SetQA();
        private void SetQACatalogues()
        {
          
                dgvQACatalogue.DataSource = _tbQACatalogueList;
                dgvQACatalogue.Refresh();
                System.Threading.Thread.Sleep(5);
            
        }        /// <summary>
        /// 设置按钮状态的委托
        /// </summary>
        delegate void ButtonStatus();        /// <summary>
        /// 采集完目录
        /// </summary>
        private void SetFinishCatalogueButtonStatus()
        {
           
                this.btnGatherCatalogue.Enabled = true;
                this.btnGatherQA.Enabled = this.dgvQACatalogue.Rows.Count > 0;
                btnStop.Enabled = false;
                _isStart = false;
                try
                {
                    _threadGetQA.Abort();
                    _threadGetQA = null;
                }
                catch (Exception)
                {                    _threadGetQA = null;
                }                this.Width--;                if (_autoGatherConfig != null && _autoGatherConfig.IsAuto) // 如果是自动采集
                {
                    btnGatherQA_Click(null, null);      // 采集问答
                }
            
        }               ///<summary>
        /// 采集目录
        /// </summary>
        private void GatherCatalogue()
        {
            object obj = new object();
            lock (obj)
            {
                SetCode setCode = new SetCode(SetCodeText);
                SetQA setQA = new SetQA(SetQACatalogues);
                SetNote setNote = new SetNote(SetTextNote);
                ButtonStatus buttonStatus = new ButtonStatus(SetFinishCatalogueButtonStatus);
                _sbMessage = new StringBuilder();
                _listQA = new List<DAS_QA.Model.DAS_GatherQA>();                _sbMessage.Append("开始采集目录......\r\n\r\n");                this.Invoke(setNote, _sbMessage.ToString());                string strHTML = "";                        // 站点源代码
                List<string> listQAUrlAndTitle = null;   // 问答路径和标题列表
                string[] QAUrlAndTitle = null;           // 问答路径和标题
                DAS_QA.Model.DAS_GatherQA gatherQA = null;  // 问答信息
                int webSiteIndex = 0;                       // 处理的第几个站点
                DAS_QA.Model.DAS_WebsiteConfig webSite = null; //当前处理的站点
                DataRow row = null;                          // 采集的新闻信息行
                List<string> listUrl = null;                   // 站点列表网址集合
                for (webSiteIndex = 0; webSiteIndex < _listCheckWebsite.Count && _isStart ; webSiteIndex++)
                {
                    webSite = _listCheckWebsite[webSiteIndex];
                    listUrl = new List<string>();
                    _sbMessage.Append("正在请求站点" + webSite.Website + "   " + webSite.WebsiteUrl + "\r\n");
                    this.Invoke(setNote, _sbMessage.ToString());                    listUrl.Add(webSite.WebsiteUrl);                    if (webSite.AutoListRule != "" && webSite.AutoListRule.ToLower() != "http://")
                    {                        for (int strat = webSite.StartNum; strat <= webSite.EndNum; strat += webSite.Distance)
                        {
                            listUrl.Add(webSite.AutoListRule.ToLower().Replace("#var#", strat.ToString()));
                        }
                    }                    for (int urlIndex = 0; urlIndex < listUrl.Count && _isStart ; urlIndex++)
                    {
                        strHTML = Framework.HTMLHelper.GetHTMLByUrl(listUrl[urlIndex],webSite.WebsiteEncoding);
                        if (strHTML == null || strHTML == "")
                        {
                            _sbMessage.Append("请求页面" + listUrl[urlIndex] + "时出错!没有找到此站点!\r\n\r\n ");                        }
                        else
                        {
                            _sbMessage.Append("已成功获取页面" + listUrl[urlIndex] + "的源代码!\r\n\r\n开始分析页面" + listUrl[urlIndex] + "的问答列表区域......\r\n");
                            this.Invoke(setNote, _sbMessage.ToString());                            this.Invoke(setCode, strHTML);
                            strHTML = Framework.HTMLHelper.GetHtmlContent(strHTML, webSite.ListAreaRule);
                            if (strHTML == null || strHTML == "")
                            {
                                _sbMessage.Append("没有找到页面" + listUrl[urlIndex] + "的问答列表区域! \r\n\r\n ");
                                this.Invoke(setNote, _sbMessage.ToString());
                            }
                            else
                            {                                _sbMessage.Append("已成功获取页面" + listUrl[urlIndex] + "的问答列表区域!\r\n \r\n开始分析页面" + listUrl[urlIndex] + "的问答列表区域......\r\n\r\n");
                                this.Invoke(setNote, _sbMessage.ToString());
                                listQAUrlAndTitle = Framework.HTMLHelper.GetHtmlContentList(strHTML, webSite.ListRule);                                if (listQAUrlAndTitle == null || listQAUrlAndTitle.Count == 0)
                                {
                                    _sbMessage.Append("没有找到页面" + listUrl[urlIndex] + "的问答列表区域的具体问答! \r\n\r\n ");
                                    this.Invoke(setNote, _sbMessage.ToString());
                                }
                                else
                                {                                    _sbMessage.Append("已成功获取页面" + listUrl[urlIndex] + "的" + listQAUrlAndTitle.Count.ToString() + "篇问答!\r\n\r\n开始分析页面" + listUrl[urlIndex] + "的问答路径......\r\n\r\n");
                                    this.Invoke(setNote, _sbMessage.ToString());                                    for (int i = 0; i < listQAUrlAndTitle.Count && _isStart; i++)
                                    {                                        QAUrlAndTitle = Framework.HTMLHelper.GetUrlAndTitle(listQAUrlAndTitle[i], webSite.ListRule);                                       
                                    }                                }
                            }
                        }
                    }
                    if (webSiteIndex == _listCheckWebsite.Count - 1)
                    {
                        _sbMessage.Append("\r\n\r\n\r\n所有站点已处理完毕!\r\n");
                    }
                    else
                    {
                        _sbMessage.Append("\r\n\r\n等待处理下一个站点......\r\n\r\n");                    }                    this.Invoke(setNote, _sbMessage.ToString());                }                this.BeginInvoke(buttonStatus);
            }        }以上是代码,在调试模式下能正常运行,直接运行exe文件时,处理16条数据后,窗体无响应。
急需! 先谢谢各位高手了!! 

解决方案 »

  1.   

    把这个 /// <summary> 
            /// 设置获取的新闻标题委托 
            /// </summary> 
            /// <param name="table"> </param> 
            delegate void SetQA(); 
            private void SetQACatalogues() 
            { 
              
                    dgvQACatalogue.DataSource = _tbQACatalogueList; 
                    dgvQACatalogue.Refresh(); 
                    System.Threading.Thread.Sleep(5); 
                
            } 修改为
    /// <summary>
            /// 设置获取的新闻标题委托
            /// </summary>
            /// <param name="table"></param>
            delegate void SetQA(int gatherQAID, string qATitle);
            private void SetQACatalogues(int gatherQAID, string qATitle)
            {
                DataRow  row = _tbQACatalogueList.NewRow();
                row["GatherQAID"] = gatherQAID;
                row["QATitle"] = qATitle;
                row["QAStatus"] = "未处理";
                _tbQACatalogueList.Rows.Add(row);
               dgvQACatalogue.Refresh();
               System.Threading.Thread.Sleep(5);
               
                
            }