我有一个返回List<T>
个事务的类。
我需要在Linq
循环内用Parallel.ForEach
(或等效的)查询该列表,因为我需要每个cicle的这些事务的子集。该子集包含特定客户的交易。
所以我的情况是List<T>
包含所有交易,我想并行化每个客户的详细说明。
客户事务的子集List<T>
然后作为参数传递给另一个类方法进行详细说明。
每个cicle只需要来自主List<T>
个交易的 READ ,并且将始终采用不同的交易子集,因为它们按客户ID分组。
ServiceItems
和 TransactionProcessor
类在.NET 3.5上...否则我可以使用 { {1}} 直接在他们身上。
而 ConcurrentBag<T>
方法则位于.NET 4.5项目中。
我想知道我的方法是否可以被认为是线程安全的,可能只是因为事务是以只读模式访问的。或者如果不是,我怎么能让它正常工作。
示例代码:
ProcessTransactions
更新
感谢@Evk。
这是一个类似的question,它阐明了多线程环境中public void ProcessTransactions
{
ServiceItems items = new ServiceItems();
// Call the method that retrieves the transactions for all customers
items.Initialize();
ConcurrentBag<ItemsGroup<TransactionItem>> itemsBag = new ConcurrentBag<ItemsGroup<TransactionItem>>(items.ItemsGroups);
ConcurrentDictionary<int, string> customers = GetCustomers(items.CustomersIds.Select(id => id.ToString()).ToList());
Parallel.ForEach(customers, options, (customer, state) =>
{
int customerId = customer.Key;
// Is this Thread Safe?
List<ItemsGroup<TransactionItem>> customerItems = itemsBag.Where(g => g.CustomerId == customerId).ToList();
// This is the transactions processor class
TransactionsProcessor processor = new TransactionsProcessor();
// This method accepts a List<ItemsGroup<TransactionItem>> object for customer transactions
processor.StartForCustomer(customerId, customerItems);
}
}
的用法。
另请参阅List<T>
上关于Linq的this。