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