将状态数据传递给并行.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副本。

我怎么把状态函数带过来呢?

将状态数据传递给并行.ForEach而不使用匿名委托

简短的回答:从匿名方法调用。
您可以将您的附加状态作为匿名方法的单独参数传递。

例如:

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

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