我想做一个完成进度的lable提示,可是在循环中提示直到完成才显示100/100,我是新手,希望高手教下我用多线程要怎么做才能实现这功能,最好能帮我写出一个简单的例子来,先谢谢了 刚才网上找的代码是
线程更新UI(自定义委托的方式):private void DoWithCommon()
{
   WaitCallback waitCallBack = new WaitCallback(this.InvokeMethod);
   ThreadPool.QueueUserWorkItem(waitCallBack, "Knights Warrior");
}private delegate void InvokeMethodDelegate(string name);
private void InvokeMethod(object x)
{
   this.Invoke(new InvokeMethodDelegate(this.ChangeUIWithCommon), x.ToString());
}private void ChangeUIWithCommon(string name)
{
   this.lblMessage.Text = name;
} 线程更新UI(通过Action委托)private void DoWithAction()
{
   WaitCallback waitCallback = new WaitCallback(this.DoSomethingWithAction);
   ThreadPool.QueueUserWorkItem(waitCallback, "Knights Warrior");
}private void DoSomethingWithAction(object x)
{
   this.Invoke(new Action<string>(this.ChangeUI), x.ToString());
}private void ChangeUI(string message)
{
   this.lblMessage.Text = message;
} 线程更新UI(通过Func委托)private void DoWithFunc()
{
   WaitCallback waitCallback = new WaitCallback(this.DoSomethingWithFunc);
   ThreadPool.QueueUserWorkItem(waitCallback, "Knights Warrior");
}private void DoSomethingWithFunc(object x)
{
   Func<string, int> f = new Func<string, int>(this.GetFuncMessage);
   object result = this.Invoke(f, x.ToString());
   MessageBox.Show(result.ToString());
}private int GetFuncMessage(string message)
{
   this.lblMessage.Text = message;
   if (message == "Knights Warrior")
   {
      return 1;
   }
   else
   {
      return 0;
   }
} 线程更新UI(通过Predicate委托)private void DoWithPredicate()
{
   WaitCallback waitCallback = new WaitCallback(this.DoSomethingWithPredicate);
   ThreadPool.QueueUserWorkItem(waitCallback, "Knights Warrior");
}private void DoSomethingWithPredicate(object x)
{
   Predicate<string> pd = new Predicate<string>(this.GetPredicateMessage);
   object result = this.Invoke(pd, x);
   MessageBox.Show(result.ToString());
}private bool GetPredicateMessage(string message)
{
   this.lblMessage.Text = message;
   if (message == "Knights Warrior")
   {
      return true;
   }
   else
   {
      return false;
   }

可是当我把  线程更新UI(自定义委托的方式)  和  线程更新UI(通过Action委托)这两种委托我都试过 放到一个循环中去后,UI上的lable不能同步更新出来
希望高手给我讲讲要怎么才能同步更新出来
最好再能给我讲下这几种委托的区别
谢谢了

解决方案 »

  1.   

    Invoke是同步更新,用BeginInvoke异步更新
      

  2.   

    为什么要用label显示进度呢?完全可以用ProgressBar啊。
    //申明一个委托,这个委托有一个ProgressBar作为参数
    private delegate void DoSomething(ProgressBar pb);
    //下面的方法是一个按钮(botton1)的点击事件,这里面调用了异步委托      
    private void button1_Click(object sender, EventArgs e)
            {
                this.BeginInvoke(new DoSomething(Fun), progressBar1);
            }
    //下面的方法为异步委托函数,每隔500ms就会加1,注意是数字增加1,因为进度条不是分为100份的所以,
    //可能不是很直观
            private void Fun(ProgressBar pb) 
            {
                pb.Maximum = 100;
                pb.Minimum =0;
                for (int i = 1; i <= 100; i++) 
                {
                    Thread.Sleep(500);
                    pb.Value = i;
                }
            }
      

  3.   

    建议你去看一下C#的委托,委托可以传入参数的。
    最简单的方法是定义一个有两个参数的委托
    private delegate void doSomething(int maxNum,para2 p2);