如果我从 parallel.Foreach 向 hashset 添加元素,我会遇到问题吗?
Could I have problems if I add elements to hashset from a parallel.Foreach?
我有一个 POCO 实体,它有一个哈希集作为导航 属性。在某些情况下,我需要向这个集合中添加新元素,所以我在想这样的事情:
MyType myPocoEntity = new MyType();
Parallel.ForEach(myList,
(iterator, state) =>
{
myPocoEntity.MyCollection.Add(new MyType(){ Id = iterator.Id });
}
我的想法是为列表中的每个元素创建一个新对象,我必须将其添加到我的 POCO 实体的哈希集中。
只是一个添加操作,但我不知道虽然它只是一个添加操作,但我是否可以解决问题,或者我是否应该先使用并发集合,然后再将元素传递给导航属性,但在这种情况下,我想最好使用 for 循环而不是并行。
所以我想知道使用并行 foreach 是否是个好主意。
谢谢。
我假设切换线程上下文和同步比 HashSet<T>.Add()
调用更昂贵,即使对于从 for 循环添加的大型集合也是如此。但是,将新成员添加到集合中的最快方法始终是使用 HashSet<T>.AddRange
操作,因此我会通过创建新集合来进一步优化代码,如果它明显小于目标集合并且比我要添加的要小只需调用 HashSet<T>.AddRange
即可。
我有一个 POCO 实体,它有一个哈希集作为导航 属性。在某些情况下,我需要向这个集合中添加新元素,所以我在想这样的事情:
MyType myPocoEntity = new MyType();
Parallel.ForEach(myList,
(iterator, state) =>
{
myPocoEntity.MyCollection.Add(new MyType(){ Id = iterator.Id });
}
我的想法是为列表中的每个元素创建一个新对象,我必须将其添加到我的 POCO 实体的哈希集中。
只是一个添加操作,但我不知道虽然它只是一个添加操作,但我是否可以解决问题,或者我是否应该先使用并发集合,然后再将元素传递给导航属性,但在这种情况下,我想最好使用 for 循环而不是并行。
所以我想知道使用并行 foreach 是否是个好主意。
谢谢。
我假设切换线程上下文和同步比 HashSet<T>.Add()
调用更昂贵,即使对于从 for 循环添加的大型集合也是如此。但是,将新成员添加到集合中的最快方法始终是使用 HashSet<T>.AddRange
操作,因此我会通过创建新集合来进一步优化代码,如果它明显小于目标集合并且比我要添加的要小只需调用 HashSet<T>.AddRange
即可。