C# 使用并行库foreach处理内存中的列表和争用问题

C# 使用并行库foreach处理内存中的列表和争用问题,c#,task-parallel-library,parallel.foreach,C#,Task Parallel Library,Parallel.foreach,我有一个需要并行处理的列表 我已经编写了一些并行代码来遍历这个列表,并生成一个供第三方使用的文件 如何避免出现多个线程试图处理同一文件的情况 我想出了这个解决办法 创建2个列表。(不确定哪种类型的集合更适合使用并行库。) 1.所有“客户”所在的主列表List 2.ProcessedList,其中包含已处理的所有文件ConcurrentBag 我的解决方案是(dummycode) 这种方法有什么问题吗?看起来您在文件争用方面走错了方向。如果您发布您试图对文件执行的操作,可能会更好。您不需要iffo

我有一个需要并行处理的列表

我已经编写了一些并行代码来遍历这个列表,并生成一个供第三方使用的文件

如何避免出现多个线程试图处理同一文件的情况

我想出了这个解决办法

创建2个列表。(不确定哪种类型的集合更适合使用并行库。)

1.所有“客户”所在的主列表
List

2.ProcessedList,其中包含已处理的所有文件
ConcurrentBag

我的解决方案是(dummycode)


这种方法有什么问题吗?

看起来您在文件争用方面走错了方向。如果您发布您试图对文件执行的操作,可能会更好。您不需要
if
for
ThrowIfCancellationRequested()
if
语句,它内部有一个确切的
if
语句。@ScottChamberlain我不知道,我看到了许多实施的例子that@CoryNelson这正是我想做的。我有一个内存中的客户对象列表,我们需要将它们保存到一个XML文件中。我希望在开始时避免多个线程试图从列表中获取同一个对象。我希望您可以扩展一点,因为您的评论非常模糊。如果我可以在继续操作时从主列表中删除,我就不需要“ProcessedList”。但我猜您无法从正在循环的集合中删除项。您的方法是什么。有代码片段吗?@user231465,您可能希望更好地描述您的数据模型。也许,包括一些信息图片。为什么同一个文件可以在列表中多次看到?
  Task t1 = Task.Factory.StartNew(() =>
            {
                try
                {
                    Parallel.ForEach(MasterList, parOpts, (customer, loopState) =>
                    {
                        if (cancelToken.Token.IsCancellationRequested)
                        {
                            cancelToken.Token.ThrowIfCancellationRequested();
                        }

                        count = Interlocked.Increment(ref count);

                        if (!processedList.Contains(customer.CustomerId))
                        {
                            DoSomething(customer, count);
                            processedList.Add(customer.CustomerId);
                        }
                    });
                }
                catch (OperationCanceledException)
                {
                   etc....
                }
            }