china_xuhua 原文地址
1、方法一:使用线程
功能描述:在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线 程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息)。下面我就简单结合一个我写的例子给大家做一个介绍。
第一步:设计界面,注意需要引用 using System.Threading;

第二步:定义一个代理,用于更新ProgressBar的值(Value)及在执行方法的时候,返回方法的处理信息。
private delegate void SetPos(int ipos,string vinfo);//代理
第三步:进度条值更新函数(参数必须跟声明的代理参数一样)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
private
void
SetTextMesssage(
int
ipos,
string
vinfo)
{
if
(
this
.InvokeRequired)
{
SetPos setpos =
new
SetPos(SetTextMesssage);
this
.Invoke(setpos,
new
object
[] { ipos,vinfo });
}
else
{
this
.label1.Text = ipos.ToString() +
"/1000"
;
this
.progressBar1.Value = Convert.ToInt32(ipos);
this
.textBox1.AppendText(vinfo);
}
}
|
第四步:函数实现
1
2
3
4
5
|
private
void
button1_Click(
object
sender, EventArgs e)
{
Thread fThread =
new
Thread(
new
ThreadStart(SleepT));
fThread.Start();
}
|
第五步:新的线程执行函数:
1
2
3
4
5
6
7
8
|
private
void
SleepT()
{
for
(
int
i = 0; i < 500; i++)
{
System.Threading.Thread.Sleep(10);
SetTextMesssage(100*i/500,i.ToString()+
"\r\n"
);
}
}
|
程序运行效果图:

2、第二种方法

控件名称:
button1;backgroundWorker1;
对backgroundWorker1控件,属性设置:

第二步:主页面后台代码:
分别为button控件和backgroundWorker1控件选好事件。
第三步:设置子窗体(及显示进度条的窗体):

只为button选好事件
执行效果为:

3、第三种方法:
功能描述:在处理大量数据的时候,有时候方法的执行需要一定的时间,这时候往往会造成页面或程序的“假死”状态,给用户的体验度也不是很好。为了避免出现 “假死”提高用户的体验度,在这里为这类型的方法加了一个进度条和一个文本框,进度条用于显示程序处理的进度,文本框用于显示在处理过程中,给与的提示。 本方法主要使用了控件:backgroundWorker1;说明:本方法与上面的方法(方法二)基本类型,主要是设计和代码进行了一些修改。
第一步:主窗体设计:
控件名称:
button1;backgroundWorker1;
对backgroundWorker1控件,属性设置:
第二步:主窗体 后台代码:
第三步:设置子窗体(及显示进度条的窗体):

控件:
progressBar1;textBox1;button1
第四步:子窗体后台代码:
实现的效果:

{
this.progressBar1.Value = e.ProgressPercentage;
this.textBox1.Text += e.UserState.ToString(); //主窗体传过来的值,通过e.UserState.ToString()来接受
}
4、第四种方法:


