【发布时间】:2017-07-06 20:53:51
【问题描述】:
如果有任何已知原因我不应该这样做,我正在寻找反馈:将 ReportProgress 放在并行 foreach 语句中。是否有任何类似的方法可以实现相同的目标,但被认为更安全或更好?
代码示例:
int iterations = 0;
int count = items.Count;
Parallel.ForEach(items, new ParallelOptions() { MaxDegreeOfParallelism = 5 }, item =>
{
iterations++;
int percentComplete = (iterations/count) * 100;
backgroundWorker.ReportProgress(percentComplete);
};
附加信息:
我有一个需要执行管理项目的特定任务的 Windows 窗体程序。使用多线程使其速度更快。但是,它需要向表单上的进度条报告已完成的整体进度,因此最终用户不会怀疑程序是否冻结。在某些情况下,整个工作可能需要几个小时。因此,必须要有进度条。
【问题讨论】:
-
只需将ProgressBar.Style() Property 设置为“Marquee”。
-
@Idle_Mind 我不认为“Marquee”将成为这种情况的一个选项:重要的是要了解工作完成了多远才能了解剩余时间。
-
您的上述代码如何报告任何有意义的进度?
-
@Idle_Mind 是伪代码,您提到的问题(现在已通过编辑修复)并没有真正影响问题的重点。但为避免将来对实际问题造成任何混淆或干扰,已编辑...
-
您仍然没有报告任何有意义的进展。代码只是简单地迭代一个不知道 BackgroundWorkers 中正在完成的实际工作的值。您可以在表单上使用标准计时器并在 Tick() 事件中调用 ReportProgress()。为什么需要额外的线程来完成这项任务?
标签: c# multithreading winforms backgroundworker parallel.foreach