簡體   English   中英

將狀態數據傳遞給Parallel.ForEach而不使用匿名委托

[英]Pass state data in to a Parallel.ForEach without using anonymous delegates

如果我有一個這樣的Parallel.ForEach,使用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
    }
}

答案很長:創建一個包含狀態的單獨類,並將該方法放在該類中。 然后,您可以傳遞實例方法,並且可以從保存它的類訪問該狀態。
這是匿名方法的編譯方式。

有關更全面的說明,請參閱我的博客

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM