关于.NET winform进度条异步完美控制的问题

关于.NET winform进度条异步完美控制的问题,第1张

我也不是很懂,写些个人意见供参考。纯属交流。

针对你提出的缺陷,

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

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12421041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存