针对你提出的缺陷,
1. 为了UI改动逻辑层是否值得。个人认为这要看你的业务逻辑层是否成熟,很明显,一个长时间运行的函数,没有任何事件接口供外部类使用是很不应该的。你可以看.net自己的类来对比一下。所以我认为是需要改动该处的。当然考虑到可能别的业务类已经在使用LongWork,而且基于面向对象开闭原则游伍,建议你通过建立新业务类来封装LongWork及加入相关事件接口,或者通过子类模旁继承,来重写LongWork方法,而不是直接改动。
2 有了上述的新业务神码或类或者子类,那么UI层也就不再需要混入业务逻辑了。至于分解子步骤,如何向外部反馈进度,那该是新逻辑类该处理的问题。我只能说进度条更多意义在于让 *** 作者知道在处理及尽可能让 *** 作者能评估后续时间,而不是完全精确。
ProgressBar控件具备一个MaxValue与MinValue(注意,含义是这个,具体名称我记不太清楚了)两个手做属性 ,设置Value时必须介於这胡明两个值之间,否则会抛出你的问题中的异常,所以当下的问题是你必须要设置一个足够大的MaxValue才行,这是第一点你所问的if else块,在非WinForm的构造线程中去改变WinForm的显示属性(例如大小,颜色,文字等等)时,是不可以直接调用的,不过你可以调用InvokeRequired检测 如果发现InvokeRequired为真时,表示你需要调用一个委托来间接修改控件的属性,如你的代毕做衡码,通过调用showProgress的一个委托来改变进度条的值
我尝试改一下你的代码:
void ShowProgress(int totalStep, int currentStep)
{
if (progressBar1.InvokeRequired)
{
ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress)
// 为了避免工作线程被阻塞,采用异步调用委托
this.BeginInvoke(showProgress, new object[] { totalStep, currentStep })
}
else
{
progressBar1.Maximum = Math.Max(totalStep, currentStep)
progressBar1.Value = currentStep
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)