[英]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.