我尝试并行处理我的数据。 因此,我使用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
);
}
答案 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);
});