2014-10-10 58 views
0

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

的实况说,在Parallel.ForEach当地的初始化参数:

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 
    ); 
} 

回答

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 
      ); 
     } 
+0

是的,你知道了!现在我理解了这个概念:资源从迭代转移到迭代。你只需要返回它。我将其修改为: processor.DoSomething();返回处理器; 由于我没有返回任何东西,它是空的! – StefanG 2014-10-10 13:40:09

0

我不知道这是否有助于您的情况,因为您似乎使用了比我通常使用的ForEach不同的重载。但是,如果你调用GetMyProcessor作用于项目那是你的myData集合中的功能,像里面:

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

像这样,它可以工作,但我不想使用它,因为我的处理器的初始化非常耗时,每个任务只需要一次。 – StefanG 2014-10-10 13:29:35

相关问题