并行使用的管道模式ForEach C#

我在这里唯一的疑问是,我必须添加什么任务才能添加到我的任务列表中,以等待该过程完成。 或者如果你有不同的方法会有所帮助,我基本上想要迭代一个ID集合,在每个ID上有两个过程依赖于另一个结果。 第一项任务是通过本地网络执行的长期任务。 并根据结果,我会添加到“MyCollection”一个新的实例,如果该任务返回true。 立足于管道模式,现在

所以,要控制所有的任务等到他们完成是我的疑问。,请看例子和评论,谢谢。

List<Task> tasks = new List<Task>();
BlockingCollection<MyType> MyCollection = new BlockingCollection<MyType>(IdsCollection.Count);

Parallel.ForEach(IdsCollection,  
                        (Id) => 
                        { 
                             Task<bool> task1 = Task.Factory.StartNew(() => 
                             {
                                 //long running task over the network
                                 return DoSmething(Id);
                             });

                             Task task1_1 = task1.ContinueWith((isValid) =>
                             {
                                 if (isValid.Result)
                                     MyCollection.Add(new MyType(Id));
                             });
                             // ??? do I need to Add both or the task1 ??
                             tasks.Add(task1_1); 
                        }
             );

        Task.WaitAll(tasks.ToArray());  

是的,添加task1_1就足够了,没有理由也明确地等待task1

但:

  • 这不是管道模式。 在那里,管道的每个阶段都是串联执行的,而不是并行执行。
  • 因为#1,没有理由分开各个阶段,使用单个Task对于两个阶段都会起作用。
  • List<T>不是线程安全的,所以你不能像这样从Parallel.ForEach()内部访问它。 这意味着你的代码可能会抛出,或者更糟的是,会产生不正确的结果。
  • 使用Parallel.ForEach()是没有意义的,如果你要做的就是启动一个Task并设置它的延续。 所有你在这里使用它都会带来一些开销。
  • 如果可以的话,考虑使你的代码的基于网络的部分异步,然后await它,这是更有效的。
  • 链接地址: http://www.djcxy.com/p/8837.html

    上一篇: Pipeline pattern using in parallel ForEach C#

    下一篇: Calling remove in foreach loop in Java