[英]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.