1 回答
TA贡献1784条经验 获得超7个赞
如果我们了解这里发生的事情,希望这将帮助您弄清楚这一点。让我们看看当您进入第 6003 个循环时会发生什么。我将假设progBarSelectInvoices.Value == 6002此时:
这条线有什么作用?
progresbarValue = progBarSelectInvoices.Value++;
最后。progresbarValue == 6004和progBarSelectInvoices == 6003
progresbarValue 永远不会再次使用,所以它可能只是被丢弃,但不确定
然后我们跳过并做一堆其他的事情,然后点击这条线:
progressCount = progBarSelectInvoices.Value;
在这里progressCount == 6003 ,然后我们这样做:
if (progressCount++ == maxCount || progressCount==invoiceCount)
那么这里会发生什么,如果maxCount == 6004不是这个的第一部分 if 是falseBUT now progessCount == 6004。我们知道如果maxCount是 6004,那么invoiceCount == 6003(从这一行maxCount = invoiceRecord.Count + 1;),但现在progressCount == 6004这也是错误的。这意味着我们执行 else 部分。
progBarSelectInvoices.Value++;
progressCount= progBarSelectInvoices.Value++;
这是做什么的?嗯,在第一行我们递增progBarSelectInvoices.Value,现在是 6004。然后我们移动到第二行,我们设置progressCount为 6004,但是我们再次递增进度条的值,所以现在是 6005。然后我们回到循环的顶部,我们做的第一件事是再次增加进度条,这将我们带到 6006。
就个人而言,我尽量避免在 if 语句中使用 pre 或 post 递增语句,因为它会使代码难以阅读。在这种情况下,我绝对会建议不要这样做。
如何修复
解决此问题的一种方法 - 如果您确定您只有 6004 条记录,因此您只会执行该 while 循环 6004 次,然后执行此操作(注意,我建议您将增量移动到while 循环,以便您在指示进度之前实际完成工作)
while (invoiceRecord.MoveLast())
{
// All your other code here
progBarSelectInvoices.Value++;
如果您想确保不超过最大值,您可以添加一个快速检查
while (invoiceRecord.MoveLast())
{
// All your other code here
if (progBarSelectInvoices.Value < progBarSelectInvoices.Maximum)
progBarSelectInvoices.Value++;
然后,您可以在检查 maxCount 并重置进度条或递增它的循环结束时取消 if/else 业务。
旁注
从该行的存在Application.DoEvents()以及在增加进度条值时您没有收到异常的事实,我偷偷怀疑您正在 UI 线程中执行此循环。每当您发现自己需要添加Application.DoEvents()事件处理程序代码时,这是问自己“如何将这项工作移出 UI 线程?”的好时机。打电话Application.DoEvents()几乎从来都不是一个好主意。看这里和这里
您应该将该代码移动到后台线程中。唯一要记住的是,您需要使用调用调用来更新进度条值。
- 1 回答
- 0 关注
- 550 浏览
添加回答
举报