C#以线程安全的方式使用ConcurrentBag <t>或LINQ等效

时间:2017-11-27 17:11:51

标签: c# multithreading linq concurrency thread-safety

我有一个返回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

0 个答案:

没有答案