using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApplication5
{
    public delegate void progressbarDelegate();
   
   
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
        
        }        private void Form1_Load(object sender, EventArgs e)
        {
            
        }               private void button1_Click(object sender, EventArgs e)
        {
            //Thread thread_bar1 = new Thread(new ThreadStart(ttread));
            //thread_bar1.Start();
            //delprogress(progress);
            Thread demoThread =new Thread(new ThreadStart(this.ThreadProcSafe));
            demoThread.Start();
        }        private void ThreadProcSafe()
        {
            this.progress();
        }  
        private void progress()
        {
                     if (this.progressBar1.InvokeRequired || this.label5.InvokeRequired)
            {
               
                progressbarDelegate d = new progressbarDelegate(progress);                if(this.IsHandleCreated)
                {
                    this.Invoke(d, new object[] { });
                }
            }
            else
            {
                
                progressBar1.Maximum = 100;
                for (int rownum = 1; rownum <= 100; rownum++)
                {
                    //你所要执行的业务。
                    rownum++;//循环次数
                    //把当前循环次数赋值给进度条的value。
                    progressBar1.Value = rownum;
                    // 这个很关键,让程序去执行进度条的前进动作
                    label5.Text = progressBar1.Value + "%";                    Application.DoEvents();
                    Thread.Sleep(100);
                    if (rownum == 100)
                    {
                        rownum = 0;
                    }
                }
            }
        }           }
}程序执行无误,但是点击关闭按钮之后,红色部分会报错:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。折腾了一天了!

解决方案 »

  1.   


     void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                timer.Enabled = false;
                Set();  
              
            }        delegate void SetValueHandler(string key,string value);
            SetValueHandler svh;
            private void Set()
            {
                svh = new SetValueHandler(SetControlValue);
                svh.Invoke("label1", "test1");
                svh.Invoke("label2", "test2");
            }        private void SetControlValue(string key, string value)
            {
                
                Control control = this.Controls.Find(key, true)[0];
                if (control.InvokeRequired)
                {
                    control.Invoke(svh, new object[] { key, value });
                }
                else
                {
                    control.Text = value; 
                }  
            }自己改去, 举一反三,可以改成通用的方法。
      

  2.   

    你Thread.Sleep(100);  是线程在sleep 了  所以窗体关闭,线程还没运行完吧,关闭窗体的时候加上关闭线程吧
      

  3.   

    Windows控件,只能在创建它的线程里访问它,
    在不同的线程访问,要通过当前线程的Invoke方法来调用
      

  4.   

     BeginInvoke((EventHandler)delegate
                {
                    label2.Text = "kao";
                });
    这么写试试
      

  5.   

    将线程定义在外面.Thread demoThread =null;
    private void button1_Click(object sender, EventArgs e)
      {
      //Thread thread_bar1 = new Thread(new ThreadStart(ttread));
      //thread_bar1.Start();
      //delprogress(progress);
      demoThread =new Thread(new ThreadStart(this.ThreadProcSafe));
      demoThread.Start();
      }
    在窗体关闭的事件中添加以下代码
    try
                {
                    if (demoThread .IsAlive)
                    {
                        demoThread .Abort();
                    }
                }
                catch { }