这是个简单的爬虫程序,想要在程序运行当中动态改变label的值,但是始终不行,
不知道什么问题?private void button1_Click(object sender, EventArgs e)
        {
            showLabelDelegate sl = new showLabelDelegate(showLabel);
            if (txt_url.Text.ToString() == "")
            {
                //MessageBox.Show("请填完全信息");
                sl.BeginInvoke("请填完全信息",null,null);
                return;
            }            button1.Enabled = false;
            button2.Enabled = true;
            //showLabelDelegate sl = new showLabelDelegate(showLabel);
                        sl.BeginInvoke("初始化中,请稍候...",null,null);            //this.BeginInvoke(sl, new object[] { "初始化中,请稍候..." });            //得到值和初始化
            this.url = txt_url.Text.ToString();
            this.begin = Convert.ToInt32(txt_begin.Text);
            this.end = Convert.ToInt32(txt_end.Text);
            urlqueue = new Queue();            //开始抓取
            string tempString = url;
            string strContent = "";
            string mearname = "";
            int m = 1;                       for (int i = begin; i <= end; i++)
            {
                tempString = url.Replace(@"**", i.ToString());
                urlqueue.Enqueue(tempString);
            }
            while (urlqueue.Count != 0)
            {
                tempString = (string)urlqueue.Dequeue();
                strContent = GetHtmlFromUrl(tempString);
                string regexString = @"<td bgcolor=#F3F8F7 colspan=2 height=21 align=center><a\shref=([\w\W]*?)\sclass=a01\starget=_blank>([\w\W]*?)</a>";
                string[] getUrls = getElements(strContent, regexString, "$1");
                string[] getNames = getElements(strContent, regexString, "$2");
                for (int k = 0; k < getUrls.Length; k++)
                {                    if (getNames[k].IndexOf(":") != -1)
                    {
                        mearname = getNames[k].Substring(getNames[k].LastIndexOf(":") + 1);
                    }
                    else
                    {
                        mearname = getNames[k];
                    }                    spiderSql.insertUrl(getUrls[k], mearname);
                    sl.BeginInvoke("初始化中,请稍候...已抓取链接(" + m + ")", null, null);
                    //this.messages.Text = "初始化中,请稍候...已抓取链接(" + m + ")";
                    m = m + 1;
                }
            }
......

解决方案 »

  1.   

    这是showLabel  
    public  void showLabel(string info_string)
            {
                Thread.Sleep(200);
                this.messages.Text = info_string;
            }
      

  2.   

    控件的值只能在创建控件的线程中改.beginInvoke的线程不能改的
      

  3.   

    beginInvoke不是可以在UI线程上调用委托所指定的方法?
      

  4.   

    你的beginInvoke是委托的beginInvoke,不是controls的.所以不在一个线程上,个人理解,找高手帮忙吧,呵呵
      

  5.   

    message.BeginInvoke(sl, new object[] { "初始化中,请稍候..." });
    改了一下代码,好像还是不行。
      

  6.   

    怪啊,我这没问题
    private delegate void show(string str);
    private void button5_Click(object sender, System.EventArgs e)
    { show s = new show(Write);
                 s.BeginInvoke(DateTime.Now.ToString("mm-ss"),null,null);
    }
    private void Write(string str)
    {
    while (true)
    {
    button4.Text = DateTime.Now.ToString("mm-ss");
    Thread.Sleep(1000);
    }
    }
      

  7.   

    public void WirteLog(string strLog)
            {
                Monitor.Enter(this);
                StreamWriter sw;
                String fileTimeMonth = ChangeToFlvLOG.ToString() + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString();
                if (Directory.Exists(fileTimeMonth) == false)
                { System.IO.Directory.CreateDirectory(fileTimeMonth); }
                //建日期文件
                String fileTimeDay = fileTimeMonth + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + ".txt";
                if (File.Exists(fileTimeDay) == false)
                {
                    sw = File.CreateText(fileTimeDay);
                }
                else
                { sw = File.AppendText(fileTimeDay); }
                strLog = DateTime.Now.ToString() + " " + strLog;
                sw.WriteLine(strLog);
                sw.Flush();
                sw.Close();
                sw = null;            if (DateTime.Now.Day != DayTemp)
                {
                    DayTemp = DateTime.Now.Day;
                    xmlData = null;
                }
                
                String str = strLog 
                xmlData.Insert(0, str);
                if (this.MyLog.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(dd);
                    this.MyLog.Invoke(d, xmlData.ToString());
                }
                else 
                {
                    this.MyLog.Text = xmlData.ToString();
                }
                Monitor.Exit(this);        }
           
            delegate void SetTextCallback(string text);
            private void dd(String xmlData)
            {            MyLog.Text=xmlData ; 
            }
      

  8.   

    不在同一个线程,需要用委托来调
    if (this.MyLog.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(dd);
                    this.MyLog.Invoke(d, xmlData.ToString());
                }
                else 
                {
                    this.MyLog.Text = xmlData.ToString();
                }
      

  9.   

    if (message.InvokeRequired)
                {
                    message.BeginInvoke(sl, new object[] { "初始化中,请稍候..." });
                }
                else
                {
                    message.Text="chushihua";
                }
    刚试过,不行,真是怪事!
      

  10.   

    把这个代码简化了一下,情况很糟糕,直到for循环完了以后label的值才变。delegate void showLabelDelegate(string tt);        private void button1_Click(object sender, EventArgs e)
            {
                showLabelDelegate sl = new showLabelDelegate(showLabel);
                if (txt_url.Text.ToString() == "")
                {
                    //MessageBox.Show("请填完全信息");
                   // message.BeginInvoke(showLabel, new object[] {"" });
                    //sl.BeginInvoke("请填完全信息",null,null);
                    return;
                }            button1.Enabled = false;
                button2.Enabled = true;
                //showLabelDelegate sl = new showLabelDelegate(showLabel);           
                message.Invoke(sl, new object[] { "初始化中,请稍候..." });
                
                //sl.BeginInvoke("初始化中,请稍候...",null,null);            //this.BeginInvoke(sl, new object[] { "初始化中,请稍候..." });            //得到值和初始化
                this.url = txt_url.Text.ToString();
                this.begin = Convert.ToInt32(txt_begin.Text);
                this.end = Convert.ToInt32(txt_end.Text);
                urlqueue = new Queue();            //开始抓取
                string tempString = url;
                string strContent = "";
                string mearname = "";
                int m = 1;            for (int i = 0; i < 2000000000; i++)
                {
                }                   }
      

  11.   

    晕死,又开了一个线程来调用这个delegate,也不行delegate void showLabelDelegate(string tt);        private void button1_Click(object sender, EventArgs e)
            {
                //showLabelDelegate sl = new showLabelDelegate(showLabel);
                if (txt_url.Text.ToString() == "")
                {
                    //MessageBox.Show("请填完全信息");
                   // message.BeginInvoke(showLabel, new object[] {"" });
                    //sl.BeginInvoke("请填完全信息",null,null);
                    return;
                }            Thread mythread = new Thread(new ThreadStart(myevent));
                mythread.Start();
                button1.Enabled = false;
                button2.Enabled = true;
                //showLabelDelegate sl = new showLabelDelegate(showLabel);           
               // message.Invoke(sl, new object[] { "初始化中,请稍候..." });
                
               //sl.BeginInvoke("初始化中,请稍候...",null,null);            //this.BeginInvoke(sl, new object[] { "初始化中,请稍候..." });            //得到值和初始化
                this.url = txt_url.Text.ToString();
                this.begin = Convert.ToInt32(txt_begin.Text);
                this.end = Convert.ToInt32(txt_end.Text);
                urlqueue = new Queue();            //开始抓取
                string tempString = url;
                string strContent = "";
                string mearname = "";
                int m = 1;            for (int i = 0; i < 2000000000; i++)
                {
                }       
            }        void myevent()
            {
                showLabelDelegate sl = new showLabelDelegate(showLabel);
                sl.BeginInvoke("sfsfs", null, null);
            }