日期:2014-05-18  浏览次数:21238 次

为何我的progressbar总是在切换完毕后,才开始滚动
先添加了 timer1
C# code

 private void timer1_Tick(object sender, EventArgs e)
        {
            if (progressBar1.Value < progressBar1.Maximum)
            {
                progressBar1.PerformStep();
            }
            else if (progressBar1.Value == progressBar1.Maximum)
            {
                progressBar1.Value = 0;
            }
        }



在 statusstrip1 添加了一个progressbar1,

C# code

 private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton2.Checked)
            {
                timer1.Enabled = true;
                //这里是大量的单元格数值计算,并填充单元格
            }
        }



为何切换已经完毕了,progresbar才开始滚动,而且反复滚动,停不下来

------解决方案--------------------
请把大量的计算移出UI线程
------解决方案--------------------
是不是在执行大量单元格数值计算的时候界面假死 执行完之后进度条就一直滚动?
如果是的话那就是说timer1_Tick在你的UI线程里面 执行大量单元格数值计算的时候线程阻塞 所以没法实时更新你的进度条 等到计算结束 timer1_Tick又再不停的执行 所以停不下来(从名字就可以看出来 Tick差不多就是一直在被触发)
------解决方案--------------------
探讨

界面县城与计算线程处于同一线程内,界面没机会更新。所以....

------解决方案--------------------
用timer1_Tick做进度条会不准确,可能会出现你数据还没处理完,进度条已经显示完了,
可以这样

 private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
if (radioButton2.Checked)
{
Thread thread=new Thread(new ThreadStart(Do));
thread.IsBackground=true;
thread.Start();
}
}

private void Do()
{
//这里是大量的单元格数值计算,并填充单元格
progressBar1.Maximum=100;
for(int i=0;i<100;i++)
{
progressBar1.value++;
}
}
里面如何操作,自己写吧