Skip to main content
 首页 » 编程设计

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

2024年01月21日27mayingbao

这是一个 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) 

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