尽管使用了并发包,但可以并发访问变量

时间:2014-12-18 11:47:30

标签: c# concurrency parallel-processing

以下是我的生产环境中的代码片段,其中我使用了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的使用是否正确?

enter image description here

1 个答案:

答案 0 :(得分:0)

导致您的问题的原因是多个线程同时采用相同的信息

lstConcurrentObj已经填满了,对吗? ConcurrentBag适用于生产者 - 消费者场景,其中您有一个或多个线程读取,另一个线程将数据写入集合。在您的情况下,您只是以并行方式阅读(使用)集合。您可以并行读取它(例如,通过Parallel.ForEach)并正常填充数据库。