如何映射ImmutableArray而不将其转换为IEnumerable,这不是线程安全的?

时间:2016-11-10 12:55:14

标签: c# multithreading linq

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

不幸的是,ImmutableArray实现了线程不安全的接口,因此LINQ的Select方法返回IEnumerable。

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

1 个答案:

答案 0 :(得分:3)

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

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

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