我有这个简单的:
for (int i = 0; i < nro_archivos; ++i) //Cargar el objeto img
{
string nombrearchivo = archivosdicom[i].FullName;
img.Add(new ImagenDicom(nombrearchivo));
Progress_Bar_Loading_Images.PerformStep();
}
接着是:
decimal[] sliceseparation_imagen = new decimal[img.Count - 1];
for (int i = 0; i < img.Count; i++)
{
if (i < img.Count - 1)
{
sliceseparation_imagen[i] = Math.Abs(img[i + 1].Z - img[i].Z);
}
}
sliceseparation_promedio = sliceseparation_imagen.Average();
现在,我的挑战是: 我实现了Paralell For但不能使用进度条..所以我在考虑使用BackgroundWorker,但问题是for之后的操作依赖于对象img的加载,这种情况发生在for中,直到那个& #39;没有完成我无法继续。 我对BackGroundWorker的理解是它在主程序继续执行时在后台执行,因此这种方法在尝试访问主程序到达for之外的代码时尚未创建的img对象时会带来错误。
在这种情况下是否值得使用Background Worker来加速img对象的加载?如果是的话,我该如何等待后台工作完成其工作然后继续执行主程序?我需要向用户报告有关操作的进度,因此使用并行执行操作时,如果没有允许我向用户报告的内容,则无法工作。 谢谢, 的Matias。
答案 0 :(得分:1)
如果我在这里理解了这个问题,那么当你加载图像时,你有一套工作,你可以不关心这个,并假装这可以并行发生,但问题是你需要报告进度。
加载后你还需要另外一个工作块,你可以马上做,也可以在加载所有图像后再做。
您可以选择任务,而不是并行。通过UI调度程序访问UI线程,因此您不必担心UI线程访问问题。
var tasks = new List<Task>
{
Task.Run(() => {
// Block 1
// Use a proper dispatcher here to access the UI thread so you can report your progress}),
};
Task.WaitAll(tasks);
现在你已经完成了你的负荷,你可以继续你的第二个工作块。
但是,我可以看到你只需要average
,你就不需要正确的顺序来获得平均值。
var tasks = new List<Task>
{
Task.Run(() => { /* for loop logic #1 */})
.ContinueWith((x)=> {
// Get your task result and execute second block
})
};
Task.WaitAll(tasks);
现在你有一个持续的任务,所有你需要做的就是在完成后调用平均值。
您也可以使用两个单独的块。我认为这些任务是交织在一起的,为什么你不能继续完成一项任务。
答案 1 :(得分:0)
使用任务可能会有所帮助
var tasks = new List<Task>
{
Task.Run(() => { /* for loop logic #1 */
/* when interacting w/UI either use Dispatcher
for WPF for control.Invoke in winforms */
}),
Task.Run(() => { /* for loop logic #2 */})
};
Task.WaitAll(tasks.ToArray());