Я наблюдаю устойчивое увеличение использования оперативной памяти в этой службе, хотя метод просто получает данные из Redis и не сохраняет его. Использование памяти падает только при вызове gc.collect () вручную после GetallmonstersSetAsync (). < /P>
Нет дополнительной обработки. Просто принесите данные и отпустите его из сферы действия. Мультиплексор - это Singleton и повторно используется < /p>
Вопрос: < /p>
Почему память не выделяется автоматически, и почему ручная gc.collect () решает ее? Это ожидаемое поведение в этом сценарии, или что -то держит ссылки дольше, чем должно? < /P>
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var now = DateTime.UtcNow;
if (now - lastStatus >= statusInterval)
{
await GetAllMonstersSetAsync();
//await UpdateMonsterStatus();
lastStatus = now;
}
//if (now - lastCombat >= combatInterval)
//{
// await SetMonsterInCombat();
// lastCombat = now;
//}
await Task.Delay(1000, stoppingToken);
}
}
private async Task GetAllMonstersSetAsync()
{
var redis = _redis.GetDatabase();
var monsterSetData = new ConcurrentDictionary();
var monsterActiveSpawns = await redis.HashGetAllAsync("Game:Monster:Spawns:Status:Active");
var monsterInactiveSpawns = await redis.HashGetAllAsync("Game:Monster:Spawns:Status:Inactive");
foreach (var monsterSpawn in monsterActiveSpawns)
{
monsterSetData.TryAdd((long)monsterSpawn.Name, monsterSpawn.Value!);
}
foreach (var monsterSpawn in monsterInactiveSpawns)
{
monsterSetData.TryAdd((long)monsterSpawn.Name, monsterSpawn.Value!);
}
return monsterSetData;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... data-fetch