蜘蛛爬虫 子线程和主线程

qxyywy 发布于 2011/08/02 16:36
阅读 400
收藏 1
C#

最近学习爬虫 在网上找了个较为完整点的爬虫 运行代码很多子线程和主线程的错误

在线程开启的时候遇到这样的问题

void RunParser()
        {
            ThreadsRunning = true;
            try
            {
                #region OldCode
                //string strUri = this.comboBoxWeb.Text.Trim();
                //if(Directory.Exists(strUri) == true)
                //    ParseFolder(strUri, 0);
                //else
                //{
                //    if(File.Exists(strUri) == false)
                //    {
                //        Normalize(ref strUri);
                //        this.comboBoxWeb.Text = strUri;
                //    }
                //    MyUri uri = new MyUri(strUri);
                //    this.EnqueueUri(uri, false);
                //}
                #endregion
                GetSpiderUrl("test");
            }
            catch(Exception e)
            {
                LogError(this.comboBoxWeb.Text, e.Message);
                return;
            }

            this.toolBarButtonContinue.Enabled = false;
            //this.buttonGo.Enabled = true;
        }

在注释的OLDCODE代码里 以及下面的红色代码都要报子线程和主线程的错误:“线程间操作无效: 从不是创建控件“statusBar”的线程访问它”。前面的代码自己用delegate 和invoke 解决了

//add zhangzj 2011-8-2
        #region 子线程调用主线程控件
        delegate void InvokeControl(string Url);
        string controlUrl = "";
        private void GetSpiderUrl(string test)
        {
            if (!InvokeRequired)
            {
                string strUri = this.comboBoxWeb.Text.Trim();
                controlUrl = strUri;
                if (Directory.Exists(strUri) == true)
                    ParseFolder(strUri, 0);
                else
                {
                    if (File.Exists(strUri) == false)
                    {
                        Normalize(ref strUri);
                        this.comboBoxWeb.Text = strUri;
                    }
                    MyUri uri = new MyUri(strUri);
                    this.EnqueueUri(uri, false);
                }
            }
            else
            {
                InvokeControl invokeControl = new InvokeControl(GetSpiderUrl);
                Invoke(invokeControl,new object[]{test});
            }
        }
        #endregion

但后面的一段代码中

// number of errors during the download process
        private int nErrorCount;
        private int ErrorCount
        {
            get    {    return nErrorCount;    }
            set
            {
                nErrorCount = value;
                this.statusBarPanelErrors.Text = Commas(nErrorCount) + " errors";
            }
        }

这个里面的this.statusBarPanelErrors.Text 也在报这种错误 请问后面这段代码中如何绝技这个问题呢?

加载中
0
张明华
 public void ChangeStatus(string text)
        {
            try
            {
                if (InvokeRequired)
                {
                    Invoke(new System.Action<string>(ChangeStatus), text);
                    return;
                }
                this.statusBar1.Text = text;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
返回顶部
顶部