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