Entity Framework Core调用DbContext后内存持续增长问题求助(Blazor Server)
Blazor Server EF Core 查询内存持续增长解决方案
针对你遇到的每次按日期查询内存持续上涨的问题,可通过以下几点优化解决:
关闭实体跟踪,优化DbContext内存占用
EF Core的DbContext默认会跟踪查询到的实体,这些被跟踪的实体会一直占用内存直到DbContext被释放。如果你的监控面板仅需展示数据无需修改,直接在查询中添加AsNoTracking():public List<Sms> GetJasminData(DateTime fromdate, DateTime todate, int count = 30) { return _dBContext.Jasmin.AsNoTracking() .Where(x => x.SendDate >= fromdate && x.SendDate <= todate) .ToList(); }同时确认
ApplicationDBContext的注册生命周期是Scoped(Blazor Server默认配置),避免单例DbContext长期持有大量实体引用。替换Task.Run,改用EF异步查询
Blazor Server组件运行在同步上下文环境中,Task.Run会额外创建线程池线程,反而可能引发不必要的内存开销。直接将查询改为异步实现:
服务方法修改为异步版本:public async Task<List<Sms>> GetJasminDataAsync(DateTime fromdate, DateTime todate, int count = 30) { return await _dBContext.Jasmin.AsNoTracking() .Where(x => x.SendDate >= fromdate && x.SendDate <= todate) .ToListAsync(); }组件调用简化为:
var data = await Service.GetJasminDataAsync(fromdate, todate); data = data?.OrderBy(x => x.SendDate).ToList();限制返回数据量,将排序移至数据库层
你的方法中定义了count参数但未使用,若查询日期范围过大,一次性返回大量数据会直接占用内存。同时将排序操作移到数据库执行,减少内存中数据处理的开销:public async Task<List<Sms>> GetJasminDataAsync(DateTime fromdate, DateTime todate, int count = 30) { return await _dBContext.Jasmin.AsNoTracking() .Where(x => x.SendDate >= fromdate && x.SendDate <= todate) .OrderBy(x => x.SendDate) .Take(count) .ToListAsync(); }组件销毁时清理数据引用
Blazor Server组件如果长期持有查询结果的引用,会延迟GC回收。实现IDisposable接口在组件销毁时清空数据:public class MonitorPanelComponent : ComponentBase, IDisposable { private List<Sms> _queryData; // 组件逻辑代码... public void Dispose() { _queryData?.Clear(); _queryData = null; } }
内容的提问来源于stack exchange,提问作者Miles Morales
相关产品推荐
相关产品推荐

