没有任何修改树的任何东西都不是线程安全的。诀窍是在一个线程中填充SortedDictionary,然后将其视为不可变,并让多个线程从中读取它们。 (你可以用一个SortedDictionary做到这一点,如前所述here。我提到这一点,因为有可能是一个收集/词典/地图就在某个地方时,读它是改变了,所以你应该总是检查。)
如果你需要修改它,那么它就会出现问题。你需要锁定它来写信给它,所有的读者都需要尊重这个锁,这意味着他们也需要锁定它,这意味着读者不能再同时阅读它。 围绕这个的最佳方式通常是创建一个全新的SortedDictionary,然后,一旦新的不可变,就将引用替换为引用新引用。 (你需要一个不稳定的参考来做这件事。)读者会毫无问题地干净地切换字典。直到最后的读者完成阅读并发布其参考,旧字典才会消失。
(有n个阅读器和1作家锁,但要避免任何锁定的。)
(并牢记参考字典可以突然改变,如果你列举。使用一个局部变量,而不是引用(volatile)引用。)
Java有一个ConcurrentSkipListMap,它允许任意数量的同时读写操作,但我不认为在.NET中有这样的东西。如果有的话,它的读取速度会比不可变的SortedDictionary慢。