并行For和后台工作
本文关键字:工作 后台 For 并行 | 更新日期: 2023-09-27 18:07:14
我有一个简单的for:
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();
}
后接this:
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();
现在,我的挑战是:我实现了parallel For,但不能使用进度条。所以我在考虑使用BackgroundWorker,但问题是,for之后的操作取决于对象img的负载,这发生在for中,所以直到那没有完成,我不能继续。我对BackGroundWorker的理解是,当主程序继续执行时,它在后台执行,所以当试图访问主程序到达for之外的代码时尚未创建的img对象时,这种方法会带来错误。
在这种情况下,是否值得使用后台工作器来加速img对象的加载?如果是,我如何等待后台工作线程完成它的工作,然后继续执行主程序?我需要向用户报告for操作的进度,因此使用并行for而没有允许我向用户报告的东西将不起作用。谢谢,Matias .如果我理解这里的问题,当你加载图像时,你有一组工作,你可以不关心这个,假装这可以并行发生但问题是你需要报告进度。
加载后,你有一个其他的工作块,你需要这样做,你可以马上做,或者你可以在所有的图像加载后做。
你可以选择任务,而不是并行。通过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);
现在你有一个持续的任务,你所要做的就是在这个完成后调用一个平均值。
你也可以用两个单独的块。我想既然这些任务是交织在一起的,为什么不继续做其中一项呢?
使用Tasks可能有帮助
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());