c# - 并发集合线程上的 linq 操作是否安全?

标签 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
        }
    });

    }
}

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

最佳答案

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

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

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

关于c# - 并发集合线程上的 linq 操作是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27569747/

相关文章:

c# - 是否可以从 WP7 中停用的事件处理程序发送 HttpWebRequest?

c# - 通过使用 2D 变换旋转图像填充矩形来模拟透视

c# - 我可以使用 LINQ 比较两个数组中的范围吗?

c# - 我可以避免对很少更改的变量使用锁吗?

c# - 如何在DynamicMethod中调用DynamicMethod

c# - 如何增加命名管道的MaxStringContentLength?

c# - 在 Where() 之前调用 OrderBy() 的区别,反之亦然

linq - F# groupBy - 系统异常 : unrecognized method call

concurrency - 在函数中将 channel 作为参数传递的不同方法

mysql - mysql如何处理并发访问?