C# 如何映射ImmutableArray而不将其强制转换为IEnumerable,因为IEnumerable不是线程安全的?

C# 如何映射ImmutableArray而不将其强制转换为IEnumerable,因为IEnumerable不是线程安全的?,c#,multithreading,linq,C#,Multithreading,Linq,所以我在多线程环境中工作,我不想一直使用ImmutableArray,因为它是线程安全的 不幸的是,ImmutableArray实现了线程不安全的接口,所以来自LINQ的Select方法返回IEnumerable 这样,我的线程安全变量就变成了线程不安全变量。 如何从ImmutableArray映射到ImmutableArray?这个问题背后似乎有很多误解。您需要查看Select方法的源代码,并了解yield关键字 其次,LINQ方法的寿命很短。您有各种线程执行各种处理任务。您是否在使用管道情况

所以我在多线程环境中工作,我不想一直使用ImmutableArray,因为它是线程安全的

不幸的是,ImmutableArray实现了线程不安全的接口,所以来自LINQ的Select方法返回IEnumerable

这样,我的线程安全变量就变成了线程不安全变量。
如何从ImmutableArray映射到ImmutableArray?

这个问题背后似乎有很多误解。您需要查看
Select
方法的源代码,并了解
yield
关键字

其次,LINQ方法的寿命很短。您有各种线程执行各种处理任务。您是否在使用管道情况,即希望在一个线程中转换数据并将结果传递给另一个线程?在这种情况下,你必须小心使用
yield
关键字;本质上,在将集合传递给下一个线程之前,您需要刷新(呃,意识到,因为没有更好的词)集合,以便在当前线程中完成实际工作。在这种情况下,对象所有权起作用,您不需要线程安全的集合


简而言之,在
ImmutableArray
上调用
Select
返回的可枚举项是完全线程安全的。你可以在任何时候实现它,它不会给你任何错误。当然,它只会在调用
Select
时遍历集合中包含的数据。它对新分配的实例一无所知。

不可变集合上的映射如何不是线程安全的?我对多线程编程不太熟悉,但我知道IEnumerable不是线程安全的,所以当它返回时,我不确定下一次计算如何进行(甚至回溯到ImmutableArray)在线程安全方面会起作用您可以为ImmutableArray创建自己的选择扩展方法,该方法将返回另一个ImmutableArray。
IEnumerable
接口不保证底层实现是线程安全的,但在不可变集合上迭代是安全的。BCL中没有
ItReadSafeEnumerable
接口,所采取的方法是简单地记录哪些类型是线程安全的,因此您可以简单地记录方法在不可变集合上返回序列的时间。不可变集合是不可变的,因此如果您没有使用反射来扰乱底层状态,它们应该通过设计来防止突变。我也不知道有任何LINQ方法会变异底层集合,但即使您确实为一个,比如说,
IList
,编写了这样一个方法,我也不知道它会如何变异一个
ImmutableArray