c#并行处理在任务资源中引发NullReference异常
我尝试并行处理我的数据。 因此,我使用localInit参数为每个并行任务初始化一个Processor对象。 它在每个任务的第一次迭代中都可以正常工作,但在第二次迭代中就不行了 迭代我总是得到一个NullReferenceException docu为Parallel.ForEach中的本地Init参数指出: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:
// 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();返回处理器;因为我没有返回任何内容,所以它是空的!