Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF6.1 DbContext内存泄漏_C#_Entity Framework_Memory_Memory Leaks - Fatal编程技术网

C# EF6.1 DbContext内存泄漏

C# EF6.1 DbContext内存泄漏,c#,entity-framework,memory,memory-leaks,C#,Entity Framework,Memory,Memory Leaks,我对EF6.1和DbContext有问题, 我有一个非常简单的类,作为用户设置/应用程序设置的数据库存储。 所以每次重新加载设置,我的记忆都会增长。但是当我从DB out注释getItem时,内存没有增长 private SettingItem GetSettingItem(SettingsDbContext context, String appName, String section, Byte scope, String name, String host, Int32? userId,

我对EF6.1和DbContext有问题, 我有一个非常简单的类,作为用户设置/应用程序设置的数据库存储。 所以每次重新加载设置,我的记忆都会增长。但是当我从DB out注释getItem时,内存没有增长

private SettingItem GetSettingItem(SettingsDbContext context, String appName, String section, Byte scope, String name, String host, Int32? userId, Int32? tenantId)
    {
        IQueryable<SettingItem> items = (from t in context.SettingItem.AsNoTracking()
                                         where t.Enabled
                                         where t.ApplicationName == appName
                                         where t.Section == section
                                         where t.SettingScope == scope
                                         where t.Name == name
                                         where (t.Host == null && host == null) || t.Host == host
                                         where (!t.UserId.HasValue && !userId.HasValue) || t.UserId == userId
                                         where (!t.TenantId.HasValue && !tenantId.HasValue) || t.TenantId == tenantId
                                         select t);

        //return context.SettingItem.FirstOrDefault();
           return items.FirstOrDefault();
    }




    public Object GetSetting(String appName, String section, Byte scope, String name, String host, Int32? userId, Int32? tenantId = null)
    {
        using (SettingsDbContext context = new SettingsDbContext(ConnString))
        {
            SettingItem item = GetSettingItem(context, appName, section, scope, name, host, userId, tenantId);

            if (item == null)
                return null;

            if (item.BinValue != null)
                return item.BinValue.ToArray();

            if (item.StringValue != null)
                return item.StringValue;

            return null;
        }
    }
private setingItem getsetingItem(setingsDBContext上下文、字符串appName、字符串部分、字节范围、字符串名称、字符串主机、Int32?用户ID、Int32?租户ID)
{
IQueryable items=(来自context.SettingItem.AsNoTracking()中的t)
其中t.已启用
其中t.ApplicationName==appName
其中t.截面==截面
其中t.SettingScope==范围
其中t.Name==Name
其中(t.Host==null&&Host==null)| | t.Host==Host
其中(!t.UserId.HasValue&!UserId.HasValue)| | t.UserId==UserId
其中(!t.TenantId.HasValue&!TenantId.HasValue)| t.TenantId==TenantId
选择t);
//返回context.SettingItem.FirstOrDefault();
返回项。FirstOrDefault();
}
公共对象GetSetting(字符串appName、字符串段、字节范围、字符串名称、字符串主机、Int32?userId、Int32?tenantId=null)
{
使用(SettingsDbContext上下文=新的SettingsDbContext(ConnString))
{
SettingItem=GetSettingItem(上下文、appName、节、范围、名称、主机、用户ID、租户ID);
如果(项==null)
返回null;
如果(item.BinValue!=null)
return item.BinValue.ToArray();
if(item.StringValue!=null)
返回item.StringValue;
返回null;
}
}
所以我做了很多测试, GetSettingItem返回null。没有内存泄漏 返回新的设置项,没有内存泄漏, 如果返回context.SettingItem.FirstOrDefault(),则泄漏速度会稍低/稍慢 作为Lambda的语句是相同的结果

我不知道这句话的问题在哪里

对于每个加载的设置,该方法执行一次。 在一个单独的测试中,我用Ado.Net获得了SettingItem,现在增加的内存非常慢(100次执行中有100kb)。因此,主要泄漏不在SettingsProvider中,而是在DbContext中

有人想办法修复它,因为在EF环境中使用Ado.Net是非常肮脏的

问候
Marc

你为什么决定内存泄漏?你用什么工具来检测它?您分析过您的应用程序吗?您运行了多长时间的测试?因为GC可能只在一段时间后启动,所以可能在几分钟后内存再次下降(或保持不变)。或者它与EF命令池或缓存有关……您是否检查了生成的查询?我猜第一个默认值作用于所有过滤元素的内存。为什么不使用Context.Settings.AsNoTracking().FirstOrDefault(t=>)?您好,我先用任务管理器测试了一个小时。在开发环境中,我也看到了它,在开发环境中,进程增长到20GB。然后我把这句话注释掉,没有增长。由于我运行了一个单独的测试,选择是由Ado.Net进行的,该方法现在具有功能,但没有增长。最后的测试是用JetBrains公司的MemoryProfiler进行的。Alexandre的想法已经过测试,但结果与之前一样。这个表只有100行,语句只返回一行,同样在我编写SingleOrDefault()时,它也在增长。