首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行For和background worker

并行For和background worker
EN

Stack Overflow用户
提问于 2016-09-16 04:07:01
回答 2查看 1.7K关注 0票数 0

我有一个简单的例子:

代码语言:javascript
复制
        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();
        }

然后是:

代码语言:javascript
复制
   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将不起作用。谢谢,马蒂亚斯。

EN

回答 2

Stack Overflow用户

发布于 2016-09-16 04:59:30

如果我理解了这里的问题,当你加载图像时,你有一组工作,你可以不太关心这一点,假装这可以并行发生,但问题是你需要报告进度。

在加载之后,你还有另外一个工作需要做,你可以马上做,也可以在所有图像加载后再做。

你可以去执行任务,而不是并行。通过UI dispatcher访问UI线程,因此您不必担心UI线程访问问题。

代码语言:javascript
复制
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,而你不需要适当的顺序来获得平均值。

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2016-09-16 04:37:17

使用任务可能会有所帮助

代码语言:javascript
复制
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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39519503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档