gpt4 book ai didi

c# - 如果我不打算在添加元素时从列表中读取,是否有必要在向其添加元素之前锁定 C# 列表?

转载 作者:太空宇宙 更新时间:2023-11-03 17:56:17 25 4
gpt4 key购买 nike

这是一个 MWE:

Func<Int32, Boolean> MyFunc = (s) => {
var res = false;
// Insert function logic to modify the value to res
return res;
};
var Result = new List<Int32> ();
var LockObj = new Object ();
ParallelEnumerable.Range (1, 100000)
.ForAll (s => {
if (MyFunc (s)) {
lock (LockObj) { // IS THIS NECESSARY?
Result.Add (s);
} // End lock
}
});

这就是情况的归结。如果我不打算在 ParallelEnumerable 语句执行完毕之前查询结果,我认为我不需要锁定结果是否正确?

请注意:我知道 MWE 最好通过“Where”子句来解决,如下所示:

ParallelEnumerable.Range (1, 100000)
.Where (s => MyFunc (s));

但由于 MWE 中不明显的原因,无法做到这一点。

编辑

感谢所有回答的人。也感谢您的评论。我已经更正了 Tung 发现的错误。

最佳答案

是的,您必须锁定。 Parallel.For 将引起对 Add() 的并发调用。

旁注:

//var Result = new List<Int32> ();
var Result = new List<Int32> (100000);
ParallelEnumerable.Range (1, 100000)

将使这更有效率。增长减少也意味着对的争夺减少。

关于c# - 如果我不打算在添加元素时从列表中读取,是否有必要在向其添加元素之前锁定 C# 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10394642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com