使用 a ConcurrentDictionary
,不要重新发明轮子。
更好的是,重构您的代码以避免这种不必要的争用。
如果线程之间没有通信,您可以执行以下操作:
假设一个函数改变一个值。
private static KeyValuePair<TKey, TValue> ValueChanger<TKey, TValue>(
KeyValuePair<TKey, TValue> initial)
{
// I don't know what you do so, i'll just return the value.
return initial;
}
假设你有一些起始数据,
var start = Enumerable.Range(1, 3000)
.Select(i => new KeyValuePair<int, object>(i, new object()));
你可以像这样一次处理它们,
var results = start.AsParallel().Select(ValueChanger);
当,results
被评估时,所有 3000ValueChangers
将同时运行,产生一个IEnumerable<KeyValuePair<int, object>>
.
线程之间不会有交互,因此不会出现并发问题。
如果你想把结果变成Dictionary
你可以的,
var resultsDictionary = results.ToDictionary(p => p.Key, p => p.Value);
这在您的情况下可能有用,也可能没有用,但是如果没有更多细节,很难说。