将状态数据传递给并行.ForEach而不使用匿名委托
本文关键字:ForEach 数据 状态 并行 | 更新日期: 2023-09-27 18:04:26
如果我有一个Parallel。在ForEach的主循环中使用匿名委托:
var someState = GetSomeState();
Parallel.ForEach(MyIEnumerableSource,
() =>
{
return new DataTable();
},
(record, loopState, localDataTable) =>
{
localDataTable.Rows.Add(someState.Value, record);
return localDataTable
},
(localDataTable) =>
{
using (var bulkInsert = new SqlBulkCopy(ConnectionString))
{
bulkInsert.DestinationTableName = "My_Table";
bulkInsert.WriteToServer(localDataTable);
}
localDataTable.Dispose();
});
我如何把它变成下面的主循环现在是一个真正的函数,但在另一个类中是静态的:
var someState = GetSomeState();
Parallel.ForEach(MyIEnumerableSource,
() =>
{
return new DataTable();
},
OtherClass.Process,
(localDataTable) =>
{
using (var bulkInsert = new SqlBulkCopy(ConnectionString))
{
bulkInsert.DestinationTableName = "My_Table";
bulkInsert.WriteToServer(localDataTable);
}
localDataTable.Dispose();
});
//In another class in another file
static class OtherClass
{
public static DataTable Process(MyRecordType record, ParallelLoopState loopState, DataTable localDataTable)
{
localDataTable.Rows.Add(someState.Value, record); //How to I bring over someState when it is called here?
return localDataTable
}
}
如何访问在for循环之外创建的状态,并且不需要成为线程本地存储的一部分?
如果这个函数不是静态的并且驻留在同一个类中,那么我将只使用实例变量,但是ForEach的主循环在另一个类中的静态函数中,并且将从代码中的多个位置使用,所有这些都有自己不同的someState
副本。
我怎么把状态函数带过来呢?
简短的回答:从匿名方法调用。
您可以将您的附加状态作为匿名方法的单独参数传递。
var someState = GetSomeState();
Parallel.ForEach(MyIEnumerableSource,
() => new DataTable(),
(record, loopState, localDataTable) =>
OtherClass.Process(record, loopState, LocalDataTable, someState),
(localDataTable) => { ... }
);
static class OtherClass
{
public static DataTable Process(MyRecordType record, ParallelLoopState loopState, DataTable localDataTable, someStateType someState)
{
localDataTable.Rows.Add(someState.Value, record);
return localDataTable
}
}
长话短说:创建一个单独的类来保存状态,并将方法放在该类中。然后你可以传递实例方法,它将从持有它的类中访问状态。
这就是编译匿名方法的方式。