Linq to Entity 中 , Query不应该有耗时操作
Linq to Entity 是一个非常棒的工具。
但是如果“滥用”就会发生奇怪的问题。
最近的项目中,遇到如下境况:
有300个表结构一致的表(拗口),需要逐一读取300个表的一个数据,排序,然后取出最小的那个数(假设这个数属于表TableA),然后从TableA中再取一个数,排序.......
然后我用Samphore,大致代码如下:
class QHelper { public QHelper(IEnumerable<TickData> arg_Q,string arg_strSelectQuery , MarketContext arg_MarketContext) { SelectQueryString = arg_strSelectQuery; Q = arg_Q; MarketContext = arg_MarketContext; _task = new Task(() => { foreach (var data in Q) { norlib.DebugHelper.DebugHelper.Set(arg_strSelectQuery , "wait data"); _sph.WaitOne(); norlib.DebugHelper.DebugHelper.Set(arg_strSelectQuery, "got data"); _data = data; } IsCompleted = true; }); _task.Start(); } public IEnumerable<TickData> Q { get; private set; } public TickData Data { get { lock (_lockGetData) { if (IsCompleted) return null; _sph.Release(); while (true) { if (IsCompleted) return null; if (_data != null) { var ret = _data; _data = null; return ret; } Thread.Sleep(100); } } } } public string SelectQueryString { get; set; } public bool IsCompleted { get; private set; } Task _task; TickData _data; Semaphore _sph = new Semaphore(0, 1); MarketContext MarketContext; object _lockGetData = new object(); }
用户只需要不断读取Data,直到返回null就可以了。
Query也对用户隐藏了。
写完感觉良好。
跑起来后就发现问题有2个。
1.300个表速度很慢,就是Data 获取的很慢
2. 在跑了一段时间后,会出现2种错误:1.远程连接被关闭 2. EndOfStreamException
个人认为这都是因为Query长时间处于非工作状态,导致mysql关闭连接所致。(Entity to SQL使用 连接池)
最后只得牺牲空间,Query中去掉等待,直接加入Queue
解决了速度问题和错误的问题,当然内存的损耗也很惊人。(⊙_⊙)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏