[英]EFCore - How to run simple query on a loop?
我正在做一个项目,用户可以在其中排队将来发生的动作。 每个未来的动作都保存在数据库中。 我正在尝试找到一种方法来获取所有已经通过的操作并对其进行操作。 目前我正在这样做:
public class TaskingManager
{
private static readonly System.Timers.Timer RefreshEventsLoop = new(1000);
public void Initialize()
{
RefreshEventsLoop.Elapsed += RefreshEventsLoop_Elapsed;
RefreshEventsLoop.AutoReset = false;
RefreshEventsLoop.Start();
}
private void RefreshEventsLoop_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
RefreshEventsLoop.Enabled = false;
ProcessEventsQueue();
RefreshEventsLoop.Enabled = true;
}
private void ProcessEventsQueue()
{
var timeNow = DateTime.UtcNow;
var context = new GalaxyDbContext(_dbOptions);
var dbFunctions = new DatabaseFunctions(context);
var eventsToProcess = context.FutureEvents
.Where(futureEvent => futureEvent.TriggerTime <= timeNow)
.ToList();
if (eventsToProcess.Any())
{
context.FutureEvents.RemoveRange(eventsToProcess);
context.SaveChanges();
foreach (var pastEvent in eventsToProcess)
{
_messageMap[pastEvent.MessageType].Invoke(dbFunctions).Execute(pastEvent);
}
}
else
{
dbFunctions.CreateFutureScienceTask();
}
}
}
这似乎工作正常。 但问题是应用程序运行一段时间后,我可以看到 LINQ 部分占用了大量 memory: 524MB used
如果我让它运行几天,那么它就会投入使用。
我猜每秒运行一次这个查询会浪费资源。 但我不知道有更好的方法来做到这一点。 有没有办法持续检查数据库中的此类内容?
我能看到的第一件事是你在使用它之后没有处理数据库上下文。 阅读本文以获取有关 entityframework 上下文生命周期的更多信息。
要正确处理它,请使用 using 语句。
using (var context = new GalaxyDbContext(_dbOptions))
{
//your code that uses the context
}
或者使用新的使用语法:
using (var context = new GalaxyDbContext(_dbOptions));
//your code that uses the context
正确知道问题可能是您每次调用 function 时都创建了一个上下文并且从不处理它并且它仍然保留对数据等的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.