先看一段代码 public partial class Form1 : Form
{
public delegate void RunProcess();
public event RunProcess runProcess; private void button1_Click(object sender, EventArgs e)
{
for(;;)
{
//这里做一些很耗资源的事情
runProcess();
}
} public void Run()
{
progressBar1.PerformStep();
} private void Form1_Load(object sender, EventArgs e)
{
runProcess = this.Run;
}
}
button1里面的循环做一些很耗资源,很耗时的事情
如果直接在循环里面用progressBar1.PerformStep();那程序会一点反应都没有
我想通过delegage让进度条去跑,不知道这样会不会让界面有反应
在这里请教各位高手
{
public delegate void RunProcess();
public event RunProcess runProcess; private void button1_Click(object sender, EventArgs e)
{
for(;;)
{
//这里做一些很耗资源的事情
runProcess();
}
} public void Run()
{
progressBar1.PerformStep();
} private void Form1_Load(object sender, EventArgs e)
{
runProcess = this.Run;
}
}
button1里面的循环做一些很耗资源,很耗时的事情
如果直接在循环里面用progressBar1.PerformStep();那程序会一点反应都没有
我想通过delegage让进度条去跑,不知道这样会不会让界面有反应
在这里请教各位高手
最好自己写一个后台线程,然后启动它,进行计算,计算的结果通过delegage返回你的窗口
不知道这样会不会让界面有反应
我的意思是能不能通过delegate,让界面从没有反应变得有反应
那如何把循环里面的事情跟进度条挂钩呢
public partial class Form1 : Form
{
Thread progress; public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
progress = new Thread(new ThreadStart(Run));
} private void button1_Click(object sender, EventArgs e)
{
progress.Start();
} public void Run()
{
for (;;)
{
progressBar1.PerformStep();
//这里做一些很耗资源的事情
}
} }
这样写能让进度条有反应吗??
private void ProgressBarPerformStep(ProgressBar bar)
{
if (bar.InvokeRequired)
{
ProgressBarPerformStepCallback d = new ProgressBarPerformStepCallback(ProgressBarPerformStep);
this.Invoke(d, new object[] { bar });
}
else
{
bar.PerformStep();
}
}然后在你的public void Run()里调用ProgressBarPerformStep(progressBar1);
可以了
感谢possible_Y
另外,在UI线程之外的其他线程中修改UI元素,比如你的进度条在VS05中有问题的,(编译会报错)
所以才引入BackgroundWorker