加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 表达式树是否是线程安全的?

发布时间:2020-12-15 19:27:53 所属栏目:百科 来源:网络整理
导读:我想缓存一些动态生成的表达式(使用 LinqKit),以便将它们传递给作为Entity Framework查询一部分的Where子句. 所以我有类似的东西 private static ExpressionFuncT,bool _expression; // Gets a value at runtimepublic IQueryableT Apply(IQueryableT query)
我想缓存一些动态生成的表达式(使用 LinqKit),以便将它们传递给作为Entity Framework查询一部分的Where子句.

所以我有类似的东西

private static Expression<Func<T,bool>> _expression; // Gets a value at runtime

public IQueryable<T> Apply(IQueryable<T> query) 
{        
    return query.Where(_expression); // Here _expression already has a value
}

多个线程调用Apply然后并行执行这些查询是否安全?是表达式< TDelegate>类线程安全吗?

Docs只提供标准“此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的……”

解决方法

表达树本身是不可变的.但是,他们可以参考确实发生变化的事情,例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

public class Test
{
    static void Main()
    {
        int multiplier = 3;
        IQueryable<int> values = new List<int> { 1,2 }.AsQueryable();
        Expression<Func<int,int>> expression = x => x * multiplier;

        // Prints 3,6
        foreach (var item in values.Select(expression))
        {
            Console.WriteLine(item);
        }

        multiplier = 5;

        // Prints 5,10
        foreach (var item in values.Select(expression))
        {
            Console.WriteLine(item);
        }
    }
}

如果你的表达式树只引用不改变的东西,它应该没问题.大多数情况都是如此.

如果表达式树确实引用了可变状态,那么如果一个线程改变了该状态,则应用表达式树的其他线程可能会或可能不会以内存模型的正常方式看到更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读