我有一个简单的例子:
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,但不能使用进度条。所以我在考虑使用BackgroundWorker,但问题是,for之后的操作依赖于对象img的加载,这发生在for中,所以在这之前,我不能继续。我对BackGroundWorker的理解是,当主程序继续执行时,它在后台执行,因此当尝试访问主程序到达for外部的代码时尚未创建的img对象时,这种方法会带来错误。
在这种情况下,是否值得使用后台工作程序来加速img对象的加载?如果是这样,我该如何等待后台工作人员完成其工作,然后继续执行主程序?我需要向用户报告for操作的进度,因此使用不允许我向用户返回报告的并行for将不起作用。谢谢,马蒂亚斯。
发布于 2016-09-16 04:59:30
如果我理解了这里的问题,当你加载图像时,你有一组工作,你可以不太关心这一点,假装这可以并行发生,但问题是你需要报告进度。
在加载之后,你还有另外一个工作需要做,你可以马上做,也可以在所有图像加载后再做。
你可以去执行任务,而不是并行。通过UI dispatcher访问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);现在你有了一个继续的任务,你所要做的就是在这个任务完成后计算一个平均值。
您也可以使用两个单独的块。我想,既然这些任务是相互交织在一起的,为什么你就不能继续执行一项任务呢?
发布于 2016-09-16 04:37:17
使用任务可能会有所帮助
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());https://stackoverflow.com/questions/39519503
复制相似问题