c#Parallel Processing在任务资源中抛出NullReference异常

时间:2014-10-10 11:25:01

标签: c# parallel-processing

我尝试并行处理我的数据。 因此,我使用localInit参数为每个并行任务初始化一个Processor对象。 它在每次任务的第一次迭代中都能正常工作,但在第二次迭代中 迭代我总是得到一个NullReferenceException。

文档说明了Parallel.ForEach中的本地Init参数:

localInit:
//     The function delegate that returns the initial state of the local data for
//     each task.

那么,我做错了什么?

Processor GetMyProcessor()
{
    Processor processor = new Processor(); 
    // Some initialization
    return processor;
}

void ParallelThings()
{
  IEnumerable<MyClass> myData = ...;
  Parallel.ForEach(
          myData,
          new ParallelOptions { MaxDegreeOfParallelism = 8 },
          GetMyProcessor,
          (data, state, processor) =>
          {
            processor.DoSomething(); // <---- Null reference exception
          },
          (item) => {} //Nothing to do for the moment
    );
}

2 个答案:

答案 0 :(得分:1)

我试过这样做,这对我来说很好。你可以运行这个并告诉我你是否还有例外吗?

static void Main(string[] args)
        {
            Program p = new Program();
            p.ParallelThings();
        }


        Processor GetMyProcessor()
        {
            Processor processor = new Processor();
            // Some initialization
            return processor;
        }

        void ParallelThings()
        {
            IEnumerable<MyClass> myData = new List<MyClass>() { new MyClass(), new MyClass(), new MyClass(), new MyClass(), new MyClass(), new MyClass(), new MyClass(), new MyClass(), new MyClass(), new MyClass()
    ,new MyClass(),new MyClass(),new MyClass(),new MyClass(),new MyClass(),new MyClass()};
            Parallel.ForEach(
                    myData,
                    new ParallelOptions { MaxDegreeOfParallelism = 8 },
                    GetMyProcessor,
                    (data, state, processor) =>
                    {
                        //  Console.WriteLine(DateTime.Now);
                        return processor.DoSomething(); // <---- NO exception
                    },
                    (item) => { } //Nothing to do for the moment
              );
        }

答案 1 :(得分:0)

我不知道这是否会对您的情况有所帮助,因为您似乎使用了与我通常使用的不同的ForEach重载。但是如果你在函数中调用GetMyProcessor会对myData集合中的项进行调用,例如:

Parallel.ForEach(myData, 
    new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount},
    dataItem =>
    {
        var processor = GetMyProcessor();
        processor.DoSomething(dataItem);
    });