gpt4 book ai didi

c# - 在不使用匿名委托(delegate)的情况下将状态数据传递到 Parallel.ForEach

转载 作者:行者123 更新时间:2023-11-30 17:16:47 24 4
gpt4 key购买 nike

如果我有一个像这样的 Parallel.ForEach,在 ForEach 的主循环中使用匿名委托(delegate):

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

长答案:创建一个单独的类来保存状态,并将方法放在该类中。然后您可以传递实例方法,它将可以访问持有它的类的状态。
这就是匿名方法的编译方式。

有关更详尽的解释,请参阅 my blog .

关于c# - 在不使用匿名委托(delegate)的情况下将状态数据传递到 Parallel.ForEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6944230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com