Пара вещей.DbContexts не являются поточно-ориентированными, поэтому их следует ограничивать только тем потоком, к которому они обращаются.Переменные уровня модуля были бы нет-нет.DbContexts также довольно дешевы, чтобы раскрутиться после того, как первый разовый удар для разрешения их сопоставления был оплачен.(Самый первый запрос к DbContext этого типа) Раскрутите один раз, когда это необходимо, особенно для многопоточных или асинхронных операций.
string LL = _context.Logs.OrderByDescending(s => s.OccurTime).FirstOrDefault().Flag; //that data which I want to streaming
Это может быть более эффективным.Ваш код эффективно выполняет:
SELECT TOP 1 * FROM Logs ORDER BY OccurTime DESC
Лучше было бы:
string LL = context.Logs
.OrderByDescending(s => s.OccurTime)
.Select(s => s.Flag)
.FirstOrDefault();
Это составляет:
SELECT TOP 1 Flag FROM Logs ORDER BY OccurTime DESC
Разница в том, что первый запрос возвращает все свойстважурнал, когда мы заботимся только о свойстве Flag.
Эти строки выглядят хорошо ...
await writer.WriteAsync(LL);
await Task.Delay(delay);
Это не имеет никакого смысла.«Флаг» не является объектом для перезагрузки, и это тот же метод, только async vs sync flavors.
await _context.Entry(LL).ReloadAsync();
_context.Entry(LL).Reload();
Я бы для начала изменил код так, чтобы он выглядел примерно так:
private async Task WriteItems(ChannelWriter<string> writer, int count, int delay)
{
while (!_abort)
{
using(var context = new LContext())
{
string flag = _context.Logs
.OrderByDescending(s => s.OccurTime)
.Select(s => s.Flag)
.FirstOrDefault();
await writer.WriteAsync(flag);
}
await Task.Delay(delay);
}
}
где _abort - это логически изменяемый логический элемент, с помощью которого у нас может быть код / пользователь, сигнализирующий о том, что фоновая задача должна корректно завершиться.
Учитывая, что этот код будет часто выполняться, я хотел бы рассмотретьРешение, которое записывает данные в базу данных журналов, но затем также сохраняет в памяти недавний скользящий кэш записей для чего-то подобного, чтобы использовать его, когда попадание в БД каждые 200 мс добавляет к загрузке чего-то, что в реальном времени может быть не критичным.