【问题】
需要添加一个进度条,用于指示当前操作出于忙的状态,或者根据具体的步骤完成程度,按照比例显示完成的百分比。
【解决过程】
1.之前就已经搜了部分参考资料。
找到了,想要设置为跑马灯,即那种一种始终滚动,不停止的效果,是将对应的progressbar的style设置为Marquee:
pgbIndicator.Style = ProgressBarStyle.Marquee;
但是此处遇到的问题是,我已经是这样设置的了,但是结果去执行了那段很耗时的登陆网站的代码,结果这个progressbar,却消失了。
本以为是没有设置为可见,所以去:
pgbIndicator.Visible = true;
但是还是不行。
后来才明白,原来是执行耗时的那部分的代码,导致此处UI没有更新,所以没法显示对应的跑马灯的效果。
好像是要添加对应的不同的别的线程,来定期或不定期地更新进度条的滚动效果。
3.看了上面一堆的讨论,貌似还是用BackgroundWorker最简单。
然后去找了相关参考代码:
http://vbcity.com/forums/t/159137.aspx
后来也找到了微软的参考代码:
http://msdn.microsoft.com/en-US/library/hybbz6ke(v=vs.80).aspx
但是实际上使用过程中,很是郁闷,首先还是没有很简单的方法可以实现:
start();
doTimeConsumingWork();
end();
的形式,而且此处发现如果用了BackgroundWorker,即使是最简单的实现了,也还是需要,告诉BackgroundWorker自己所需要做的事情是什么,
即需要在doWork中写死每个BackgroundWorker要做的事情的,使用起来,可以说极为不便啊。
更要命的是,还不能打断点调试,否则到了断点位置,鼠标就变成忙状态,而无法继续调试,就会死掉。。。
被搞崩溃了,算了,果断放弃此方法。private void btnInit_Click(object sender, EventArgs e)
{
Thread thread = new Thread(doInit);
thread.IsBackground = true;
thread.Start();
}
delegate void showProgressbarDelegate();
public void showProgressbar()
{
if (InvokeRequired)
{
this.BeginInvoke(new showProgressbarDelegate(showProgressbar), new object[] { });
return;
}
pgbIndicator.Style = ProgressBarStyle.Marquee;
}
private void doInit()
{
showProgressbar();
//do time consuming work ...
}
还是没法运行,会出现跨线程调用无法访问某参数的异常:
An unhandled exception of type ’System.InvalidOperationException’ occurred in System.Windows.Forms.dll:
Additional information: Cross-thread operation not valid: Contrl ‘trvSkydrive’accessed from a thread other than the thread it was created on.