c#并行处理在任务资源中引发NullReference异常

c#并行处理在任务资源中引发NullReference异常,c#,parallel-processing,C#,Parallel Processing,我尝试并行处理我的数据。 因此,我使用localInit参数为每个并行任务初始化一个Processor对象。 它在每个任务的第一次迭代中都可以正常工作,但在第二次迭代中就不行了 迭代我总是得到一个NullReferenceException docu为Parallel.ForEach中的本地Init参数指出: localInit: // The function delegate that returns the initial state of the local data for /

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

docu为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
    );
}
处理器GetMyProcessor() { 处理器=新处理器(); //一些初始化 返回处理器; } 虚无 { IEnumerable myData=。。。; 并行ForEach( 我的数据, 新的并行选项{MaxDegreeOfParallelism=8}, GetMyProcessor, (数据、状态、处理器)=> { processor.DoSomething();//{}//暂时无事可做 ); }
我不知道这是否有助于您的情况,因为您使用的ForEach重载似乎与我通常使用的不同。但是,如果您在作用于myData collection中的项的函数中调用GetMyProcessor会怎么样,例如:

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

我试过这样做,这对我来说很好。你能运行这个并告诉我你是否仍然遇到异常吗

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
              );
        }
static void Main(字符串[]args)
{
程序p=新程序();
p、 平行事物();
}
处理器GetMyProcessor()
{
处理器=新处理器();
//一些初始化
返回处理器;
}
虚无
{
IEnumerable myData=new List(){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()};
并行ForEach(
我的数据,
新的并行选项{MaxDegreeOfParallelism=8},
GetMyProcessor,
(数据、状态、处理器)=>
{
//Console.WriteLine(DateTime.Now);
return processor.DoSomething();//{}//暂时无事可做
);
}

像这样它可以工作,但我不想使用它,因为我的处理器的初始化非常耗时,而且每个任务只需要一次。是的,你知道了!现在我明白了这个概念:资源是从一个迭代到另一个迭代移交的。你只需要返回它。我将它修改为:Processor.DoSomething();返回处理器;因为我没有返回任何内容,所以它是空的!