对并发集合线程的linq操作是否安全?

Anc*_*tax 8 c# linq concurrency

例如以下代码线程安全:

ConcurrentQueue<Guid> _queue = new ConcurrentQueue<Guid>();
while(true)
{
for(int y = 0; y < 3; y++)
{
    if(y % 3 == 0)
    {
    System.Threading.Tasks.Task.Run(() => _queue.Enqueue(Guid.NewGuid()));
    }
    else if (y % 3 == 1)
    {
    Guid x;
    System.Threading.Tasks.Task.Run(() => _queue.TryDequeue(out x));
    }
    else if(y % 3 == 2)
    {
    System.Threading.Tasks.Task.Run(() =>
    {
        if (_queue.Any(t => t == testGuid))
        {
        // Do something
        }
    });

    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:显然标题不够清晰,所以更新了代码示例以包含实际的多线程行为,是的,上面的代码只是多线程行为的一个示例.

Pan*_*vos 9

LINQ操作是只读的,因此它们对所有集合都是线程安全的.当然,如果添加修改集合WhereSelect方法内的集合的代码,它们将不再是线程安全的.

线程安全集合确保修改是线程安全的,这在执行LINQ查询时并不是真正的问题.

什么是不是安全是遍历期间修改的集合.正常集合在修改它们时会使迭代器失效,而线程安全集合则不会.在某些情况下(例如在ConcurrentQueue中),这是通过在迭代期间呈现数据的快照来实现的.