gpt4 book ai didi

c# - 我如何在 Parallel.ForEach 期间添加或更新此 .NET 集合?

转载 作者:行者123 更新时间:2023-11-30 15:30:33 25 4
gpt4 key购买 nike

我有一个文件列表,其中每个文件都包含一个 Foo 数据列表。现在,相同的 Foo 数据(例如 Id = 1)可能存在于多个文件中,但更新的数据会覆盖现有数据。

我只是将每条数据读入内存集合。

if !cache.HasKey(foo.Id) then Add    
else cache[foo.Id].UpdatedOn < foo.UpdatedOn then Update
else do nothing

当我读取文件时(因为有一些 em),我也在使用 Parallel.ForEach(files, file => { .. });

我不确定我该怎么做。

我正在考虑使用 ConcurrentDictionary,但我不确定如何使用 where 子句执行 AddOrUpdate

有什么建议吗?

最佳答案

您可以使用 ConcurrentDictionary,如下所示:

dictionary.AddOrUpdate(foo.Id, foo, (id, existing) => 
existing.UpdatedOn < foo.UpdatedOn ? foo : existing);

由于下面评论中的讨论,我将解释为什么这里没有竞争条件。 This MSDN 文章讨论了值(value)工厂的运行方式,并提到:

Therefore, it is not guaranteed that the data that is returned by GetOrAdd is the same data that was created by the thread's valueFactory.

这是有道理的,因为并发字典的设计者不希望用户代码锁定字典不知道多长时间,从而使其无用。相反,AddOrUpdate 所做的是在两个嵌套循环中运行。这是一些伪代码:

do { 
while (!TryGetValue(key, out value))
if (TryAdd(key, addValue)) return;
newValue = updateValueFactory(key, value);
} while (TryUpdate(key, newValue, value));

TryUpdate 获取特定存储桶的锁,将当前值与检索到的值进行比较,仅当它们匹配时 才执行更新。如果失败,外循环再次发生,TryGetValue 返回最新值,再次调用值工厂,等等。

因此可以保证,如果更新成功,值工厂将始终具有最新值。

关于c# - 我如何在 Parallel.ForEach 期间添加或更新此 .NET 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21877631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com