以下是我的生产环境中的代码片段,其中我使用了parallel.foreach和concurrent bag
Parallel.ForEach(lstTasks, options, item =>
{
Repository.AssignmentDTO.TaskAssignmentDTO tskVar;
while (lstConcurrentObj.TryTake(out tskVar))
{
finaltaskslist.Add(ProcessTaskAssgn(item, tskVar));
}
//}
});
finaltaskslist是一个列表,我在方法ProcessTaskAssgn ....中执行一些长操作后添加对象。
上面的lstConcurrentObj是我已经添加了一些具有相同值的初始化对象的并发包。
然后使用此列表填充数据表。
然而,当我查看数据表中的条目时,很明显条目已重复或混合, 推断我的ProcessTaskAssgn方法实际上并不是线程安全的,并且并发操作给出了不正确的结果。 我对concurrentbag的使用是否正确?
答案 0 :(得分:0)
导致您的问题的原因是多个线程同时采用相同的信息
lstConcurrentObj已经填满了,对吗? ConcurrentBag适用于生产者 - 消费者场景,其中您有一个或多个线程读取,另一个线程将数据写入集合。在您的情况下,您只是以并行方式阅读(使用)集合。您可以并行读取它(例如,通过Parallel.ForEach)并正常填充数据库。