我想做一个完成进度的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不能同步更新出来
希望高手给我讲讲要怎么才能同步更新出来
最好再能给我讲下这几种委托的区别
谢谢了
线程更新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不能同步更新出来
希望高手给我讲讲要怎么才能同步更新出来
最好再能给我讲下这几种委托的区别
谢谢了
//申明一个委托,这个委托有一个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;
}
}
最简单的方法是定义一个有两个参数的委托
private delegate void doSomething(int maxNum,para2 p2);