Search code examples
c#c#-4.0parallel.foreach

How do I collect return values from Parallel.ForEach?


I'm calling a slow webservice in parallel. Things were great until I realized I need to get some information back from the service. But I don't see where to get the values back. I can't write to the database, HttpContext.Current appears to be null inside of a method called using Parallel.ForEach

Below is a sample program (in your mind, please imagine a slow web service instead of a string concatenation)

using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        WordMaker m = new WordMaker();
        m.MakeIt();
    }
    public class WordMaker
    {
        public void MakeIt()
        {
            string[] words = { "ack", "ook" };
            ParallelLoopResult result = Parallel.ForEach(words, word => AddB(word));
            Console.WriteLine("Where did my results go?");
            Console.ReadKey();
        }
        public string AddB(string word)
        {
            return "b" + word;
        }
    }

}

Solution

  • You've discarded it in here.

    ParallelLoopResult result = Parallel.ForEach(words, word => AddB(word));
    

    You probably want something like,

    ParallelLoopResult result = Parallel.ForEach(words, word =>
    {
        string result = AddB(word);
        // do something with result
    });
    

    If you want some sort of collection at the end of this, consider using one of the collections under System.Collections.Concurrent, like ConcurrentBag

    ConcurrentBag<string> resultCollection = new ConcurrentBag<string>();
    ParallelLoopResult result = Parallel.ForEach(words, word =>
    {
        resultCollection.Add(AddB(word));
    });
    
    // Do something with the result